0

下面程序的输出是: 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类。所以现在设置为 value 。Class 也是如此,因为它是虚拟的,所以它被设置为 number 。我万万没想到。为什么会这样?A10AmyInt10cmyInt6005

4

1 回答 1

0

请参阅parashift中的文章:

因为一个虚拟基类子对象在一个实例中只出现一次,所以有一些特殊的规则可以确保每个实例只调用一次虚拟基类的构造函数和析构函数。C++ 规则说,虚拟基类是在所有非虚拟基类之前构造的。作为程序员,你需要知道的是:类继承层次结构中任何位置的虚拟基类的构造函数都由“最派生”类的构造函数调用。

于 2013-02-16T13:25:58.690 回答