钻石继承中的虚拟 classes 在基础 class 和最派生的 class 之间有多个 classes

Virtual classes in diamond inheritance with multiple classes in between base class and most derived class

好吧,在 classic 钻石继承示例中,您有一个基础 class,两个 class 继承自该基础 class 的元素,然后是另一个 class 从那两个继承而来,制作出漂亮的对称钻石。在那种情况下,两个 classes 实际上继承自基础 class,以避免在最派生的 class.

中有两个基础 class 的副本

但是,如果在基础 class 和最派生的 class 之间存在多级继承,该怎么办,如下面的示例图所示。是否所有 classes(B、C、D)都需要从它们的直接基础 classes 虚拟继承,或者只是直接从基础 class 继承的那些(B、C) ]?假设除了图中的那些之外没有其他 class。

不需要将 C 声明为虚拟,因为虚拟所做的是确保这样声明的 class 恰好包含一次,并且 C 仅继承自一次。基本上,唯一需要虚拟的继承是

class B : public virtual A { ... };
class C : public virtual A { ... };

来源:https://en.cppreference.com/w/cpp/language/derived_class