Я не уверен, что я действительно понимаю ваш вопрос, и я думаю, что вам нужно уточнить, чего вы пытаетесь достичь больше.
Только несколько других комментариев.
Я не думаю, что публичное наследование (как вы реализовали) является лучшим шаблоном проектирования для использования здесь. Золотое правило с публичным наследованием заключается в том, что его следует использовать, только если производный класс действительно "является" объектом класса base .
Одним из основных преимуществ использования наследования в C ++ является реализация полиморфизма , где (например) у вас есть список указателей на Base
объекты, и вы вызываете методы для этих объектов, и они отправляется соответствующим объектным методам VisualComponent
и PhysicsComponent
в зависимости от ситуации.
Поскольку (по вашим словам) они имеют "несвязанные интерфейсы классов", вы не получите никаких преимуществ от полиморфизма.
Похоже, вы действительно наследуете от класса Base
для реализации шаблона Mixin .
Может быть, композиция - лучший подход, когда вы включаете копию класса Base
(который вам придется переименовать) в класс VisualComponent
или PhysicsComponent
.
Однако, исходя из следующего вопроса:
Если у меня есть только ссылка или указатель
Основать, какие варианты дизайна у меня есть
выставить интерфейс
VisualComponent или PhysicsComponent?
Разве класс GameObject
(который вы создаете в main()
) уже делает это для вас?
Edit:
Хорошо, я думаю, теперь я понимаю, что вопрос отредактирован.
Но мне нужен какой-то способ хранить все
Компоненты динамически в
GameObject, но все еще можно использовать
их индивидуальные интерфейсы.
Единственный простой способ увидеть эту работу - создать метод virtual
в Base
, который переопределяется в каждом производном классе и реализует поведение, специфичное для класса. GameObject
может просто хранить контейнер с указателями Base
и вызывать метод (ы) virtual
, который будет отправлен производным классам.
Я бы также порекомендовал сделать Render()
, Move()
и любые не виртуальные методы private
, чтобы класс GameObject
мог получить доступ только к общедоступным (virtual
) методам. Помогает поддерживать общедоступный интерфейс в чистоте.
Я не уверен, поможет ли это.
Редактировать 2:
После дальнейшего обсуждения в комментариях звучит так: фабричный шаблон или абстрактный фабричный шаблон - это то, что вам нужно.