当一个类继承于其他类,并且类中有类对象作为成员,这种情况下该类的初始化顺序为:先初始化继承的类,顺序按照继承的顺序从前到后,然后初始化类成员,顺序按照定义的顺序;
举例:
假设有3个基类,分别为Base1,Base2,Base3,三个类中均在构造函数和析构函数中打印出信息标识当前的执行顺序;类Derive继承自这3个类,且有这3个类的成员;
1 #include <iostream> 2 3 using namespace std; 4 5 class Base1 6 { 7 private: 8 int i; 9 public: 10 Base1(int i) : i(i) { 11 cout << "Base1 Constructor.." << endl; 12 } 13 ~Base1() { cout << "Base1 Destructor.." << endl; } 14 }; 15 16 class Base2 17 { 18 private: 19 int s; 20 public: 21 Base2(int s) : s(s) { 22 cout << "Base2 Constructor.." << endl; 23 } 24 ~Base2() { cout << "Base2 Destructor.." << endl; } 25 }; 26 27 class Base3 28 { 29 public: 30 Base3() { 31 cout << "Base3 Constructor.." << endl; 32 } 33 ~Base3() { cout << "Base3 Destructor.." << endl; } 34 }; 35 36 class Derive : public Base2, public Base1, public Base3 37 { 38 public: 39 Derive(int a, int b, int c, int d): Base1(a), member2(d), member1(c), Base2(b){} 40 private: 41 Base1 member1; 42 Base2 member2; 43 Base3 member3; 44 }; 45 46 int main() 47 { 48 Derive obj(1, 2, 3, 4); 49 50 return 0; 51 }
代码如上,debug结果如下:
定义Derive类的对象,首先进入Derive类的构造函数:
单步进入:
进入Base2的构造函数,因Derive类继承顺序依次为Base2--Base1--Base3,
继续执行,进入Base1的构造函数:
继续执行进入Base3的构造函数:
初始化完继承的3个类后,开始初始化类内成员,按照定义顺序,接下来单步执行,进入:
继续执行进入:
继续执行进入:
虚构顺序与上相反;
执行结果如下: