Скажем, у меня есть следующая структура классов:
class Car;
class FooCar : public Car;
class BarCar : public Car;
class Engine;
class FooEngine : public Engine;
class BarEngine : public Engine;
Пусть также дать Car дескриптор его Engine. A FooCar будет создан с помощью FooEngine*, а BarCar будет создан с помощью BarEngine*. Есть ли способ организовать вещи, поэтому объект FooCar может вызывать функции-члены FooEngine без downcasting?
Вот почему структура класса выложена так, как сейчас:
- Все
CarимеютEngine. Кроме того, aFooCarбудет использовать толькоFooEngine. - Есть данные и алгоритмы, разделяемые всеми
Engine, которые я бы предпочел не копировать и вставлять. - Возможно, мне захочется написать функцию, которая требует, чтобы
Engineзнал о ееCar.
Как только я набрал dynamic_cast при написании этого кода, я знал, что, вероятно, что-то не так. Есть ли лучший способ сделать это?
UPDATE:
Основываясь на ответах, данных до сих пор, я склоняюсь к двум возможностям:
- Имейте
Carдля предоставления чистой виртуальной функцииgetEngine(). Это позволило быFooCarиBarCarиметь реализации, возвращающие правильный типEngine. - Поглотите все функциональные возможности
Engineв дереве наследованияCar.Engineбыл разбит по причинам технического обслуживания (чтобы сохранить материалEngineв отдельном месте). Это компромисс между наличием меньших классов (малым по строкам кода) и меньшим количеством больших классов.
Есть ли сильное предпочтение сообщества для одного из этих решений? Есть ли третий вариант, который я не рассматривал?