ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++类继承和组合的初始化顺序

2022-02-21 21:02:06  阅读:127  来源: 互联网

标签:初始化 顺序 继承 C++ Base1 Derive 构造函数


当一个类继承于其他类,并且类中有类对象作为成员,这种情况下该类的初始化顺序为:先初始化继承的类,顺序按照继承的顺序从前到后,然后初始化类成员,顺序按照定义的顺序;

举例:

假设有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个类后,开始初始化类内成员,按照定义顺序,接下来单步执行,进入:

 

继续执行进入:

 

继续执行进入:

 

 虚构顺序与上相反;

执行结果如下:

 

标签:初始化,顺序,继承,C++,Base1,Derive,构造函数
来源: https://www.cnblogs.com/DOTA-SPE/p/15920613.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有