Хорошо, заголовок довольно полный, и я думаю, что, возможно, поэтому было сложно найти ответ через Google или этот сайт.Может быть, я просто не знаю, как правильно выразить проблему, но здесь говорится:
У меня есть ряд методов в классе SimpleOpenGLRenderer
, каждый из которых принимает один аргумент, расширяющий Model
учебный класс.Таким образом, идея заключается в том, что в зависимости от типа модели средство визуализации вызовет правильный метод, который знает, как ее отобразить.Вот упрощенный исполняемый пример, основанный на проблеме:
#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 ++ может показаться очевидным, что это не такработать, как планировалось, но это просто не имеет смысла для меня.Во время выполнения я не буду знать точный тип Model
, передаваемого рендереру (следовательно, попытка перегрузки разрешить его).Исходя из фона Java, я использовал эту технику раньше, а в Java вызываемый метод будет таким, который лучше всего соответствует типу аргумента runtime .В C ++ это похоже на тип ссылки во время компиляции, даже если эта ссылка может оказаться в подклассе, который, на мой взгляд, лучше соответствует другой функции.
До сих пор я не бралэто соответствие типа времени выполнения как должное.Это просто не существует в C ++ или я иду по этому пути неправильно?Должен ли я сделать что-то по-другому в C ++ для достижения этого?
Спасибо,
Гари.