Скажем, у меня есть следующая структура классов:
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
в отдельном месте). Это компромисс между наличием меньших классов (малым по строкам кода) и меньшим количеством больших классов.
Есть ли сильное предпочтение сообщества для одного из этих решений? Есть ли третий вариант, который я не рассматривал?