假设我有以下类结构:
class Car;
class FooCar : public Car;
class BarCar : public Car;
class Engine;
class FooEngine : public Engine;
class BarEngine : public Engine;
让我们也给它Car
一个句柄Engine
。AFooCar
将由 a 创建,FooEngine*
aBarCar
将由 a 创建BarEngine*
。有没有办法安排事情,以便FooCar
对象可以调用成员函数而FooEngine
无需向下转换?
这就是为什么类结构按现在的方式布局的原因:
- 所有
Car
s 都有一个Engine
. 此外, aFooCar
只会使用 aFooEngine
。 - 所有
Engine
s 共享的数据和算法我宁愿不复制和粘贴。 - 我可能想编写一个需要
Engine
知道它的函数Car
。
在编写这段代码时,我一打字dynamic_cast
就知道我可能做错了什么。有一个更好的方法吗?
更新:
根据目前给出的答案,我倾向于两种可能性:
- 已经
Car
提供了一个纯虚getEngine()
函数。这将允许FooCar
并BarCar
拥有返回正确类型的Engine
. Engine
将所有功能吸收到Car
继承树中。Engine
出于维护原因(将这些Engine
东西保存在一个单独的地方)。这是拥有更多小类(小代码行)与拥有更少大类之间的权衡。
社区是否对其中一种解决方案有强烈的偏好?有没有我没有考虑过的第三种选择?