c ++虚拟继承

Rob*_*ert 22 c++ virtual gcc virtual-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
  /* ... */
};
Run Code Online (Sandbox Code Playgroud)

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

想法?TIA/Rob

CB *_*ley 46

virtual基类的特殊之处在于它们由最派生的类初始化,而不是由从虚拟基础继承的任何中间基类初始化.初始化一个碱基的正确选择是哪个潜在的多个初始化器?

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

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


Ben*_*enG 8

您需要从C显式调用Base的构造函数:

class C : public A, public B {
public:
C(C* pParent) : Base(pParent), A(pParent), B(pParent) {}
/*... */
};
Run Code Online (Sandbox Code Playgroud)

  • 我不知道你能做到这一点。这是否意味着编译器会忽略“A”和“B”的编译器中似乎初始化“Base”的代码? (2认同)
  • 不仅_can_你这样做,你______做它.没有代码被忽略.`Base`的构造函数只会被调用一次,然后是A和B的构造函数的主体,然后是C的构造函数的主体. (2认同)

Tro*_*nic 5

如果声明自定义构造函数,则禁用默认构造函数.在虚拟继承中,您需要直接调用虚拟继承的构造函数,否则它将不知道是由A还是由B初始化.