【发布时间】:2010-10-02 08:24:33
【问题描述】:
假设我有以下类结构:
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 的成员函数而无需向下转换?
这就是为什么类结构是现在这样布置的原因:
- 所有
Cars 都有一个Engine。此外,FooCar只会使用FooEngine。 - 我不想复制和粘贴所有
Engines 共享的数据和算法。 - 我可能想编写一个需要
Engine才能知道其Car的函数。
当我在编写这段代码时输入dynamic_cast,我就知道我可能做错了什么。有没有更好的方法来做到这一点?
更新:
根据目前给出的答案,我倾向于两种可能性:
- 让
Car提供一个纯虚拟getEngine()函数。这将允许FooCar和BarCar具有返回正确类型的Engine的实现。 - 将所有
Engine功能吸收到Car继承树中。Engine出于维护原因被打破(将Engine的东西放在一个单独的地方)。这是拥有更多小类(代码行少)与更少大类之间的权衡。
社区是否对其中一种解决方案有强烈的偏好?有没有我没有考虑过的第三种选择?
【问题讨论】:
-
也许你应该让问题的标题更具体一点?比如“如何避免使用 dynamic_cast”。顺便说一句,这是一个很好的问题。
标签: c++ oop inheritance dynamic-cast car-analogy