У меня есть вопрос о проблеме, с которой я борюсь. Надеюсь, вы можете терпеть меня.
Представьте, что у меня есть класс Object, представляющий базовый класс иерархии физических объектов. Позже я наследую от него, чтобы создать классы Object1D, Object2D и Object3D. Каждый из этих производных классов будет иметь определенные методы и атрибуты. Например, 3D-объект может иметь функцию загрузки 3D-модели, которая будет использоваться средством визуализации.
Итак, у меня было бы что-то вроде этого:
class Object {};
class Object1D : public Object { Point mPos; };
class Object2D : public Object { ... };
class Object3D : public Object { Model mModel; };
Теперь у меня был бы отдельный класс с именем Renderer, который просто принимает объект в качестве аргумента и, ну, рендерит его :-) Подобным образом я хотел бы поддерживать разные виды рендереров. Например, я мог бы иметь стандартную версию, на которую мог бы полагаться каждый объект, а затем предоставить другие специальные средства визуализации для некоторых объектов:
class Renderer {}; // Default one
class Renderer3D : public Renderer {};
И вот моя проблема. Класс рендерера должен получить объект в качестве аргумента, например, в конструкторе, чтобы получить любые данные, необходимые для рендеринга объекта.
Все идет нормально. Но Renderer3D должен получить аргумент Object3D, чтобы получить не только основные атрибуты, но и конкретные атрибуты 3D-объекта.
Конструкторы будут выглядеть так:
CRenderer(Object& object);
CRenderer3D(Object3D& object);
Теперь, как мне указать это в общем виде? Или еще лучше, есть ли лучший способ спроектировать это?
Я знаю, что могу положиться на RTTI или что-то подобное, но я хотел бы избежать этого, если это возможно, поскольку я чувствую, что, вероятно, есть лучший способ справиться с этим.
Заранее спасибо!