c++ virtual虚基类继承的优先性问题

来源:百度知道 编辑:UC知道 时间:2024/09/26 13:17:01
#include <iostream.h>
class OBJ1{public:OBJ1(){cout<<"OBJ1\n";}};
class OBJ2{public:OBJ2(){cout<<"OBJ2\n";}};
class Base1{public:Base1(){cout<<"Base1\n";}};
class Base2{public:Base2(){cout<<"Base2\n";}};
class Base3{public:Base3(){cout<<"Base3\n";}};
class Base4{public:Base4(){cout<<"Base4\n";}};
class Derived:public Base1,virtual public Base2,public Base3,virtual public Base4
{
public:
Derived():Base4(),Base3(),Base2(),Base1(),obj2(),obj1()
{
cout<<"Derived ok.\n";
}
protected:
OBJ1 obj1;OBJ2 obj2;
}
main()
{
Derived aa;
cout<<"This is OK.\n";
}

以上这个程序运行输出的是
Base2
Base4
Base1
Base3
OBJ1
OBJ2
Derived is ok.
This is OK.

请问为什么
class Derived:public

在讨论之前我们先建立一个类的继承层次模型:

class Base1 {
public:
Base1(void) {
cout << "class Base1" << endl;
}
};
class Base2 {
public:
Base2(void) {
cout << "class Base2" << endl;
}
};
class Level1:virtual public Base2,public Base1 {
public:
Level1(void) {
cout << "class Level1" << endl;
}
};
class Level2:public Base2,virtual public Base1 {
public:
Level2(void) {
cout << "class Level2" << endl;
}
};
class Leaf:public Level1,virtual public Level2 {
public:
Leaf(void) {
cout << "class Leaf" << endl;
}
};

int main(void) {
Leaf obj;
return 0;
}

不看下面的分析,大家觉得输出结果应该是怎么样的?如果没有虚拟继承,也许能很快说出答案。

现在来分析一下在多继承和虚拟继承的情况下,构造函数的调用顺序是怎么样的。<