c++ - 非虚拟多重继承示例

标签 c++ multiple-inheritance

是否有使用非虚拟多重继承的真实示例?我想要一个主要是出于教学原因。在名为 A 的类周围拍打, B , C , 和 D , 其中 BC继承自 AD继承自 BC可以很好地解释“D 对象是否/应该有一个或两个 A 子对象?”这个问题,但对于为什么我们甚至有两种选择都没有任何意义。许多例子关心我们为什么想要虚拟继承,但为什么我们不想要虚拟继承?

我知道什么是虚拟基类以及如何在代码中表达这些东西。我知道菱形继承和带有虚拟基类的多重继承的例子很多。

我能找到的最好的是车辆。基类是 VehicleCar 继承和 Boat .除其他外,Vehicleoccupants()max_speed() .所以一个Amphibian继承自 CarBoat继承不同的max_speed()在陆地和水上——这是有道理的——但也不同occupants() ——这没有任何意义。所以Vehicle子对象并不是真正独立的;这是另一个可能很有趣的问题,但这不是问题所在。

有没有一个例子,作为一个真实世界的模型是有意义的,其中两个子对象是真正独立的?

最佳答案

你像 OOP 程序员一样思考,试图设计事物的抽象模型。 C++ 多重继承,就像 C++ 中的许多东西一样,是一种具有特殊效果的工具。它是否映射到某些 OOP 模型与工具本身的实用性无关。换句话说,您不需要“真实世界模型”来证明非虚拟继承的合理性;你只需要一个真实的用例。

因为派生类继承了基类的成员,所以 C++ 中经常使用继承作为一种将一组通用功能集合在一起的方法,有时与派生类的交互最少,并将此功能直接注入(inject)派生类。

Curiously Recurring Template Pattern 和其他类似 mixin 的结构就是这样做的机制。这个想法是你有一个作为模板的基类,它的模板参数是使用它的派生类。这允许基类在没有virtual 的情况下对派生类本身进行一些访问。职能。

我能想到的 C++ 中最简单的例子是 enable_shared_from_this ,它允许对象的生命周期当前由 shared_ptr 管理实际检索 shared_ptr仅从对该对象的指针/引用到该对象。它使用 CRTP 添加制作 shared_from_this 所需的各种成员和接口(interface)可用于派生类。而且由于继承是公开的,它也允许shared_ptr的各种函数“启用 shared_from_this”以检测特定类型是否具有 shared_from_this里面的东西并正确初始化它。
enable_shared_from_this不需要虚拟继承,并且确实可能​​无法很好地使用它。

现在想象一下,我有一些其他的 CRTP 类,可以将其他一些功能注入(inject)到一个对象中。此功能与 shared_ptr 无关,但它使用 CRTP 和继承。

好吧,如果我现在写一些想要从 enable_shared_from_this 继承的类型而这个其他功能,很好,工作得很好。不需要虚拟继承,实际上这样做只会使组合变得更加困难。

虚拟继承不是免费的。它从根本上改变了关于类型如何与其基类相关的许多事情。如果您从这种类型继承,您的构造函数必须直接初始化任何虚拟基类。这种类型的布局非常奇怪,不太可能标准化。以及其他各种事情。 C++ 尽量不让程序员为他们不使用的功能付费,所以如果你不需要虚拟继承的特殊属性,你就不应该使用它。

关于c++ - 非虚拟多重继承示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60824822/

相关文章:

c++ - STL 容器的 std::string_view

c++ - 从 2 个继承类访问静态成员

multiple-inheritance - Raku 如何处理菱形继承(钻石问题)(多重继承)?

c++ - 如何使用 gdb 调试插件

c++ - 如何通过导入的目标可传递地设置 “CMAKE_EXE_LINKER_FLAGS”?

c++ - 如果构造函数中有错误,则停止进程

python - 具有多重继承的Django自定义字段

c++ - 从任意数量的类派生

java - 如何正确设计多个子类的组合?

c++ - 构建 shared_ptr 时遇到问题