C++构造函数初始化按下列顺序被调用:
- 首先,任何虚拟基类的构造函数按照它们被继承的顺序构造;
- 其次,任何非虚拟基类的构造函数按照它们被继承的顺序构造;
- 最后,任何成员对象的构造函数按照它们声明的顺序调用;
析构函数的调用顺序刚好相反!
#include <iostream>
using namespace std;
class member1{
public:
member1(){ cout<<"member1,It is member\n"; }
};
class member2{
public:
member2(){ cout<<"member1, It is member\n";}
};
class Base1{
public:
Base1(){ cout<<"Base1,It is public\n";}
};
class Base2{
public:
Base2(){ cout <<"Base2, It is virtual public\n"; }
};
class Base3{
public:
Base3(){ cout <<"Base3,It is public\n"; }
};
class Base4{
public:
Base4(){ cout <<"Base4,It is virtual public\n"; }
};
class Derived :public Base1, virtual public Base2,public Base3, virtual public Base4
{
public:
Derived() :Base4(), Base3(), Base2(),Base1(), m1(), m2()
{//初始化列表
cout <<"Derived ok.\n";
}
protected:
member1 m1;//声明顺序
member2 m2;
};
int main()
{
Derived aa;//初始化
cout <<"This is ok.\n";
return 0;
}
结果如下: