C ++虚拟继承C ++虚拟继承(c++ virtual inheritance)

2019-05-09 00:12发布

问题:

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
  /* ... */
};

在给定的位置,海湾合作委员会抱怨说,它无法比拟的函数调用基地(),即默认的构造函数。 但是C没有直接继承基础,只有通过A和B.那么,为什么GCC抱怨吗?

想法? TIA /罗布

Answer 1:

virtual的,因为它们是由最派生类,而不是由从虚拟基继承的任何中间基类初始化基类是特殊的。 其潜在的多个初始化会用于初始化一个基本正确的选择呢?

如果正在建造的最派生类在其成员initalization名单没有列出它,然后虚基类初始化必须存在并且可以访问它的默认构造函数。

需要注意的是虚基标识被允许在即使是没有问题类的直接基构造函数的初始化列表中使用。



Answer 2:

你需要从C显式调用构造函数库:

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


Answer 3:

如果你声明的自定义构造函数,默认构造函数被禁用。 在虚拟继承你需要直接调用几乎继承的构造,因为否则将不知道是否通过A或B.通过初始化



文章来源: c++ virtual inheritance