假设我具有以下类结构:
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()
函数。这将使FooCar
和BarCar
具有返回正确类型的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/