非虚拟多重继承的例子

Bol*_*pat 5 c++ multiple-inheritance

是否有使用非虚拟多重继承的真实示例?我想有一个主要是出于教学原因。拍身边命名类ABC,和D,其中BC继承A,并D从继承BC是完全没有解释这个问题:“确实/如果一个D对象有一个或两个A子对象?”,但不承担任何关于为什么我们甚至有两个重选项。许多例子关心我们为什么想要虚拟继承,但为什么我们不想要虚拟继承?

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

我能找到的最好的是车辆。基类是VehicleCar和继承的Boat。除其他外, a Vehiclehasoccupants()和 a max_speed()。因此Amphibian,从两者继承Car并在陆地和水上Boat继承不同的东西max_speed()——这是有道理的——但也是不同的occupants()——这是没有道理的。所以Vehicle子对象并不是真正独立的;这是另一个可能很有趣解决的问题,但这不是问题。

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

Nic*_*las 5

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

因为派生类继承了基类的成员,所以在 C++ 中经常使用继承作为将一组公共功能收集在一起的手段,有时与派生类的交互最少,并将此功能直接注入派生类。

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

我能在 C++ 中想到的最简单的例子是enable_shared_from_this,它允许生命周期当前由 a 管理的对象仅从指向该对象的指针/引用中shared_ptr实际检索shared_ptr到该对象的 a 。这使用 CRTP 添加各种成员和接口,使shared_from_this派生类成为可能。并且由于继承是公开的,它还允许shared_ptr“启用 shared_from_this”的各种函数来检测特定类型是否包含shared_from_this内容并正确初始化它。

enable_shared_from_this 不需要虚拟继承,并且确实可能​​无法很好地使用它。

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

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

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