Сопоставление перегруженной функции с ее полиморфным аргументом

Хорошо, заголовок полон, и я думаю, что, вероятно, поэтому было сложно найти ответ через 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 ++ для этого?

Спасибо,

Гэри.

18
задан Steve Jessop 1 August 2011 в 11:22
поделиться