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