#include<iostream.h>
class A{
public:
int i;
A(int j=3):i(j){}
};
class B:virtual public A{
public:
B(int j=2):A(j){}
};
class C:virtual public A{
public:
C(int j=1):A(j){}
};
class D:public B, public C {
public:
D(int j=0):A(j), B(j+1), C(j+2){}
};
int main()
{
D d;
cout<<d.i;
return 0;
}
我无法理解最终输出为何为零。每次以默认方式将 j 初始化为某个固定值时,如何将类 D 的构造函数中初始化的值传递给类 A?
最佳答案
由于A是一个虚基类,它应该只构造一次,所以不可能用不同的构造函数参数创建它,C++编译器必须选择一种创建基类的方式。
显而易见的问题是:使用哪个?
规则是:直接继承A的最派生类中指定的。
初始化顺序很简单:首先是A(参数值来自D的构造函数初始化列表),然后是B(它是D的第一个祖先;它使用之前创建的A的实例),然后是C(它共享相同的 A 实例),最后是 D(并且它还与 B 和 C 共享相同的 A 对象)。
关于c++ - 这个初始化列表是如何使用虚类实现的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180243/