假设我有以下的类结构:
class Car;
class FooCar : public Car;
class BarCar : public Car;
class Engine;
class FooEngine : public Engine;
class BarEngine : public Engine;
让我们给一个名为Car
的类添加对其Engine
的引用。创建一个具有FooEngine*
的FooCar
和一个具有BarEngine*
的BarCar
。是否有一种方式可以安排事情,使得FooCar
对象可以调用FooEngine
的成员函数而无需进行向下转换?目前这个类结构的布局原因如下:
1.所有的
Car
都有一个Engine
。此外,FooCar
只会使用FooEngine
。2.有一些数据和算法是所有
Engine
共享的,我不想复制和粘贴它们。3.可能会编写需要一个
Engine
知道其Car
的函数。在编写此代码时,一旦键入
dynamic_cast
,我就知道自己可能做错了什么。是否有更好的方法来解决这个问题?更新:
根据迄今为止给出的答案,我倾向于两种可能性:
1.让
Car
提供一个纯虚拟的getEngine()
函数。这将允许FooCar
和BarCar
具有返回正确类型的Engine
的实现。2.将所有
Engine
功能吸收到Car
继承树中。出于维护原因,Engine
被拆分开来(以将Engine
的东西保留在一个单独的位置)。这是在代码行数上拥有更多小类(小类)与拥有更少大类之间的权衡。是否有强烈的社区偏好选项?是否有我还没有考虑的第三种选择?