c ++虚拟inheritance

问题:

class Base { public: Base(Base* pParent); /* implements basic stuff */ }; class A : virtual public Base { public: A(A* pParent) : Base(pParent) {} /* ... */ }; class B : virtual public Base { public: B(B* pParent) : Base(pParent) {} /* ... */ }; class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here /* ... */ }; 

在给定的位置,gcc抱怨它不能匹配到Base()的函数调用,即默认的构造函数。 但是C不能直接从Baseinheritance,只能通过A和B.那么为什么gcc会在这里抱怨呢?

想法? TIA / Rob

virtual基类的特殊之处在于,它们是由大多数派生类初始化的,而不是从虚拟基类inheritance的任何中间基类。 哪个潜在的多个初始化器会初始化一个基地的正确select?

如果构造的大多数派生类没有在其成员初始化列表中列出,则虚拟基类将使用其默认构造函数进行初始化,该构造函数必须存在且可访问。

请注意,虚拟基本标识符允许在构造函数的初始化程序列表中使用,即使它不是相关类的直接基础。

你需要明确地调用基地的构造函数从C:

 class C : public A, public B { public: C(C* pParent) : Base(pParent), A(pParent), B(pParent) {} /*... */ }; 

如果你声明了一个自定义的构造函数,那么默认的构造函数是被禁用的。 在虚拟inheritance中,您需要直接调用虚拟inheritance的构造函数,否则不知道是由A还是由B来初始化。