c++虚拟公共继承初始化奇怪的结果

c++ virtual public inheritance init strange result?

本文关键字:结果 初始化 继承 虚拟 c++      更新时间:2023-10-16

以下程序的输出为:5.5

#include <iostream>
using namespace std;
struct A
{
public:
    int myInt;
    A(int n): myInt(n){}
    A(): myInt(5) {}
};

class B : virtual public A
{
public:
    B(int n):A(10) {}
    B():A(10) {}
};
class C : virtual public A
{
public:
    C(int n):A(3*n) {}
};
class D : public B, public C
{
public:
    D(int n=90) : C(2*n), B(n) {}
};
class E : public D
{
public:
    E(int n=20):D(n-1) {}
};
int main()
{
    D d(100);
    cout << d.myInt << endl;
    E e;
    cout << e.myInt << endl;
    return 0;
}

考虑对象d。据我所知,继承是基于继承列表(而不是初始化列表)的顺序构建的,因此B类首先用参数100构建,然后用参数10构建到类A。所以现在AmyInt设置为值10。类c也是如此,因为myInt是虚拟的,所以它被设置为数字600。我从没想过5。为什么会发生这种情况?

参见parashift:中的文章

因为虚拟基类子对象在例如,有一些特殊的规则来确保虚拟基础类的构造函数和析构函数每例子C++规则说虚拟基类是构造的在所有非虚拟基类之前。你作为一个程序员需要知道的是:任何地方的虚拟基类的构造函数在类的继承层次结构中,由"最派生的"调用类的构造函数。