#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?
答案 0 :(得分:2)
具有虚拟基础继承的规则是:
“层次结构中派生程度最高的类必须构建虚拟基础”
在您的情况下,来自派生程度最高的类D
您通过传递参数A
显式调用了0
的构造函数,因此它将i
设置为{{1} }}。如规则中所述,虚拟基类仅通过大多数派生类构造,而其他构造函数通过中间层次结构调用没有任何效果,因为它只构造一次。
通话顺序为:
0
答案 1 :(得分:2)
由于A是一个虚拟基类,因此它只应构造一次,因此无法使用不同的构造函数参数创建它,并且C ++编译器必须选择一种创建基类的方法。
显而易见的问题是:使用哪一个?
规则是:在最派生类中指定的直接继承A的那个。
初始化顺序很简单:首先是A(带有来自D构造函数初始化列表的参数值),然后是B(它是D的第一个祖先;它使用之前创建的A的实例),然后是C(并且它共享相同的A实例),最后是D(并且它也与B和C共享相同的A对象)。