Хорошо, заголовок полон, и я думаю, что, вероятно, поэтому было сложно найти ответ через Google или этот сайт. Возможно, я просто не знаю, как правильно выразить проблему, но вот что:
У меня есть ряд методов в классе SimpleOpenGLRenderer
, которые все принимают один аргумент, расширяющий ] Класс модели
. Идея состоит в том, что в зависимости от типа модели средство визуализации вызовет правильный метод, который знает, как ее визуализировать. Вот упрощенный пример исполняемого файла, основанный на проблеме:
#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);
}
Результатом этого примера является:
Render the cube.
Throw an exception, my renderer does not support the model type you have provided.
Более опытному разработчику C ++ может показаться очевидным, что это не работает так, как планировалось, но просто не имеет смысла меня. Во время выполнения я не буду знать точный тип модели
, переданной рендереру (отсюда и попытка перегрузки для ее разрешения). Исходя из опыта Java, я использовал эту технику раньше, и в Java вызываемый метод будет тем, который лучше всего соответствует типу аргумента runtime . В C ++ кажется, что он соответствует типу ссылки во время компиляции, даже если эта ссылка может оказаться подклассом, который, на мой взгляд, лучше соответствует другой функции.
До сих пор я использовал этот тип среды выполнения. соответствие как должное. Неужели этого просто нет в C ++, или я ошибаюсь? Должен ли я сделать что-нибудь в C ++ для этого?
Спасибо,
Гэри.