c++多重继承和显式构造函数调用

标签 c++ inheritance constructor compiler-errors multiple-inheritance

假设我们有一个父类 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 类型中 BC 的顺序将改变 A 的方式基类被初始化。

关于c++多重继承和显式构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50104823/

相关文章:

c++ - 为什么节点不能链接在一起?

java - 如何强制接口(interface)出现在所有继承级别上

java - java中如何引用扩展子类?

javascript - 在 Javascript 中创建对象的方式有何不同?

c++ - 如何从 S 函数调用 matlab 变量?

c++ - 如何动态分配涉及指针的结构?

c++ - 我能以某种方式将 Maple 过程包含到 C++ 代码中吗

C++ 派生类 - 从父类调用虚函数?

c# - 在构造函数局部函数 c# 中设置只读字段

java - 将 Java 类构造函数添加到 ArrayList(扩展)