Được rồi, tiêu đề là một lời nói và tôi nghĩ đó có thể là lý do tại sao việc tìm câu trả lời qua google hoặc trang web này là khó khăn. Nó có thể chỉ là tôi không biết làm thế nào để thể hiện vấn đề một cách chính xác nhưng ở đây đi:Phù hợp với chức năng quá tải đối với đối số đa hình
Tôi có một loạt các phương thức trong một lớp học SimpleOpenGLRenderer
mà tất cả lấy một đối số duy nhất mở rộng lớp Model
. Vì vậy, ý tưởng là tùy thuộc vào loại mô hình, trình kết xuất sẽ gọi phương thức chính xác biết cách hiển thị nó. Dưới đây là một ví dụ thực thi đơn giản dựa trên các vấn đề:
#include <stdio.h>
class Model {};
class Cube : public Model {};
class Sphere : public Model {};
class Renderer
{
public:
virtual void renderModel(const Model& model) = 0;
};
class SimpleOpenGLRenderer
{
public:
void renderModel(const Cube& model)
{
printf("Render the cube.\n");
}
void renderModel(const Model& model)
{
printf("Throw an exception, my renderer does not support the model type you have provided.\n");
}
void renderModel(const Sphere& model)
{
printf("Render the sphere.\n");
}
};
int
main(int argc, char** argv)
{
Cube cube;
Model& model = cube;
SimpleOpenGLRenderer renderer;
renderer.renderModel(cube);
renderer.renderModel(model);
}
Kết quả của ví dụ này là:
Render the cube.
Throw an exception, my renderer does not support the model type you have provided.
Nó có vẻ hiển nhiên đối với một C++ phát triển dày dạn hơn mà điều này không hoạt động theo kế hoạch nhưng nó không có ý nghĩa với tôi. Khi chạy, tôi sẽ không biết loại chính xác của Model
được truyền cho trình kết xuất (do đó quá tải đã cố gắng để giải quyết nó). Đến từ một nền Java, tôi đã sử dụng kỹ thuật này trước và trong Java, phương thức được gọi là sẽ phù hợp nhất với loại đối số thời gian chạy là của đối số. Trong C++ nó có vẻ khớp với kiểu thời gian biên dịch của tham chiếu, ngay cả khi tham chiếu đó có thể kết thúc tới một lớp con - theo ý tôi - phù hợp hơn với một hàm khác.
Cho đến bây giờ tôi đã thực hiện loại đối sánh thời gian chạy này cho phù hợp. Liệu nó đơn giản không tồn tại trong C + + hay tôi đang đi về điều này một cách sai lầm? Tôi có nên làm điều gì đó khác trong C++ để đạt được nó?
Xin cảm ơn,
Gary.
Cảm ơn. Tôi đã không sử dụng mô hình đó trước đây. Tôi đoán nó có thể không phổ biến trong Java. Tôi đã thực hiện một số thử nghiệm và tôi nghĩ rằng tôi có thể sẽ quay trở lại giải pháp 'dynamic_cast'. Tôi đã hy vọng cho một cái gì đó thanh lịch hơn nhưng mô hình công văn đôi/khách truy cập dường như giới thiệu tất cả các loại phụ thuộc và khớp nối chặt chẽ mà tôi không quá quan tâm. –