假设我们有一个父类 A,它有 protected 成员 x 和 y 以及一个构造函数:
A::A(int xpos, int ypos) : x(xpos), y(ypos) {}
现在考虑我们有两个类 B 和 C,它们继承自 A 并具有如下定义的构造函数。
class B : public virtual A
B::B(int xpos, int ypos) : A(xpos,ypos) {}
class C : public virtual A
C::C(int xpos, int ypos) : A(xpos,ypos) {}
最后让我们有一个继承 B 和 C 的类 D。
class D : public B, public C
如果我按如下方式编写 Ds 构造函数,我会收到一个编译错误,指出 Ds 构造函数必须显式调用 As 构造函数。
D::D(int xpos, int ypos) : B(xpos,ypos), C(xpos,ypos) {}
这是为什么?如果我试图从我对类构造函数一无所知的类继承,这肯定会有问题吗? B 和 C 都显式调用 As 构造函数还不够吗?
最佳答案
虚拟 基的规则是最派生的类调用它的构造函数。如果不是这种情况,哪个中间基类应该构造虚拟基的一个拷贝?假设类 B
的构造函数在构造 A
时颠倒了参数的顺序:
B::B(int xpos, int ypos) : A(ypos, xpos) {}
现在,A
子对象的状态应该是什么?第一个构造函数获胜?最后一个赢了?无论哪种方式,它都很脆弱:更改 D
类型中 B
和 C
的顺序将改变 A
的方式基类被初始化。
关于c++多重继承和显式构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50104823/