非虚拟多重继承示例

Example for non-virtual multiple inheritance

是否有使用非虚拟多重继承的真实示例?我想要一个主要是出于教学原因。围绕 class 命名为 ABCD,其中 BC 继承自 AD 继承自 B 并且 C 非常适合解释问题 "Does/Should a D object have one or two A sub-objects?",但对于为什么我们甚至有这两个选项都没有影响。很多例子关心我们为什么要虚拟继承,但为什么我们不想要虚拟继承?

我知道什么是虚拟基 classes 以及如何在代码中表达这些内容。我知道菱形继承和具有虚拟基础的多重继承的例子很多class。

我能找到的最好的就是车辆。基数 class 是 Vehicle,由 CarBoat 继承。除其他外,Vehicleoccupants()max_speed()。因此,从 CarBoat 继承的 Amphibian 在陆地和水上继承了不同的 max_speed() – 这是有道理的 – 但也不同 occupants() – 并且那没有意义。所以 Vehicle 子对象并不是真正独立的;这是另一个可能很有趣的问题,但不是问题所在。

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

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

因为派生 class 继承基类 class 的成员,继承在 C++ 中经常用作将一组通用功能收集在一起的方法,有时与派生的交互最少class,并将此功能直接注入派生的 class.

Curiously Recurring Template Pattern 和其他类似 mixin 的构造是执行此操作的机制。这个想法是你有一个作为模板的基础class,它的模板参数是使用它的derivedclass。这允许基础 class 可以在没有 virtual 函数的情况下访问派生的 class 本身。

我能想到的 C++ 中最简单的例子是 enable_shared_from_this,它允许生命周期当前由 shared_ptr 管理的对象实际检索到该对象的 shared_ptr从 pointer/reference 到那个对象。它使用 CRTP 添加使 shared_from_this 成为派生的 class 所需的各种成员和接口。由于继承是 public,它还允许 shared_ptr 的各种函数 "enable shared_from_this" 检测特定类型中是否包含 shared_from_this 内容并正确初始化它。

enable_shared_from_this 不需要虚拟继承,实际上可能不会很好地使用它。

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

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

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

这和 C++ 有非虚拟方法的原因是一样的——因为如果你使用非虚拟继承,实现会更简单和更有效,所以如果你想要它,你需要显式地请求虚拟继承。如果您 类 从不使用多重继承,那么您 不需要 ,这是默认设置。