|
你的程序有几个小错误
1.class B2 里面的func()的cout<<B2<<endl;,B2应该加上"";
2.B2(int i)最后加上};
输出结果:
B23
B2
B1
B24
B2
B1
需要注意的是:虚拟基类构造是由最终派生类来负责的;不管虚拟基类出现在继承的那个层次,总是先调用虚拟基类的构造函数
拿这段程序来说,D1先继承B1,但是B1没有基类了,关键在B2,D1虚拟继承于B2,B2继承于I1
由于D1是最终派生类,所以他的虚拟基类的构造就由他负责,D1()的初始化列表里有B2(3),所以先调用B2::B2(int i),
B2(int i)会先调用I1的构造函数,但是I1没有写默认构造函数,所以执行B2::B2(int i)的函数体,先输出B23,
之后调用B2::func()(虽然这里不会有什么问题,但是还是需要注意的一点是虚函数的调用机制在构造函数里不起作用),输出B2;
虚拟基类构造完毕之后,其他基类及成员按照他们声明的顺序依次构造
先是基类B1,由于D1()的初始化列表里有B1(1),所以调用B1::B1(int i),输出B1;
由于虚基类B2已经构造完毕,所以用4初始化成员b2,调用B2::B2(int i),先输出B24;
之后B2::func()输出B2;
之后用2初始化b1,调用B1::B1(int i),输出B1;
之后D1()的函数体,but nothing;
至此d构造完毕。 |
|