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