首页 > 技术文章 > 派生类构造函数的执行顺序

shanql 2016-04-25 00:34 原文

派生类构造函数的执行顺序

 

 

 

下面给出一个例子

 

代码:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 
 6 //打印函数名辅助宏
 7 #define PRINT_FUNC_NAME()\
 8     cout << __FUNCTION__ << endl;
 9 
10 
11 //构造及析构函数声明与实现辅助宏
12 #define DE_AND_CONSTRUCTOR( className )\
13 public:\
14     className(int a)\
15     :m_a(a)\
16     {\
17         PRINT_FUNC_NAME()\
18     }\
19     virtual ~className()\
20     {\
21         PRINT_FUNC_NAME()\
22     }\
23 private:\
24     int m_a;
25 
26 
27 class Base1
28 {
29     DE_AND_CONSTRUCTOR(Base1)
30 };
31 
32 class Base2
33 {
34     DE_AND_CONSTRUCTOR(Base2)
35 };
36 
37 class Base3
38 {
39     DE_AND_CONSTRUCTOR(Base3)
40 };
41 
42 class Member1
43 {
44     DE_AND_CONSTRUCTOR(Member1)
45 };
46 
47 class Member2
48 {
49     DE_AND_CONSTRUCTOR(Member2)
50 };
51 
52 
53 
54 class Derived: public Base1, public Base2, public Base3
55 {
56 public:
57     Derived()//注意此处的顺序与执行的顺序无关
58         :Base3(0), m_Member1(0), Base1(0), Base2(0),m_Member2(0)
59     {
60         PRINT_FUNC_NAME()
61     }
62     virtual ~Derived()
63     {
64         PRINT_FUNC_NAME()
65     }
66 
67 private:
68     Member1 m_Member1;
69     Member2 m_Member2;
70 };
71 
72 
73 
74 int main()
75 {
76     Derived mDerived;
77 
78     return 0;
79 }

 

运行结果:

 

 

参考:C++语言程序设计(4) 清华大学 郑莉 【第七章 7.4 派生类的构造和析构函数】

推荐阅读