假设我具有以下类结构:

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时,我就知道自己可能做错了什么。有一个更好的方法吗?

    更新:

    根据到目前为止给出的答案,我倾向于两种可能性:
  • Car提供纯虚拟的getEngine()函数。这将使FooCarBarCar具有返回正确类型的Engine的实现。
  • 将所有Engine功能吸收到Car继承树中。出于维护原因而将Engine分解(将Engine内容保留在单独的位置)。这是在拥有更多小类(在代码行中少)与减少大类之间的权衡。

  • 这些解决方案之一是否有强烈的社区偏好?我还有没有考虑过的第三种选择?

    最佳答案

    我假设Car拥有一个Engine指针,这就是为什么您发现自己垂头丧气。

    将指针移出基类,然后将其替换为纯虚拟的get_engine()函数。然后,您的FooCar和BarCar可以保存指向正确引擎类型的指针。

    (编辑)

    工作原理:

    由于虚拟函数Car::get_engine()将返回引用或指针,因此C++将允许派生类以不同的返回类型来实现此功能,只要返回类型仅是更多派生类型而有所不同。

    这称为covariant return types,并将允许每种Car类型返回正确的Engine

    关于c++ - 如何避免在我的C++代码中使用dynamic_cast?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/459503/

    10-13 07:03