一道C++问题,运行结果为什么是这个样子

来源:百度知道 编辑:UC知道 时间:2024/06/15 19:28:13
#include <iostream.h>
class OBJ1{public:OBJ1(){cout<<"OBJ1"<<endl;}};
class OBJ2{public:OBJ2(){cout<<"OBJ2"<<endl;}};
class Base1{public:Base1(){cout<<"Base1"<<endl;}};
class Base2{public:Base2(){cout<<"Base2"<<endl;}};
class Derived:public Base1,virtual public Base2
{
public:
Derived():Base1(),Base2(),obj1(),obj2(){cout<<"Derived"<<endl;}
protected:OBJ2 obj2;OBJ1 obj1;
};
void main()
{ Derived aa; }
为什么运行结果是这个:
Base2
Base1
OBJ2
OBJ1
Derived
把private去掉之后就是
Base1
Base2
OBJ2
OBJ1
Derived
高手请教!!!

因为加上virtual后 Base2就是 Derived的虚基类
在同一层次上构造函数优先级是 虚基类〉非虚基类〉派生类。

基类中,先调用虚基类的构造函数,非虚的按声明的顺序调用.
成员的构造函数也是按声明的顺序来,所以虽然你在构造函数中写了obj1(),obj2(),但调用时还是先调用OBJ2的构造函数.

虚基类的构造函数在任何非虚基类构造函数前调用.所以。。。