【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

文章目录

一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则


1、场景说明

如果一个类

  • 既 继承了 基类 ,
  • 又 在类中 维护了一个 其它类型 的 成员变量 ,

那么 该类 的 构造 与 析构 , 就需要涉及到

  • 类 本身 的 构造函数 和 析构函数 ,
  • 父类 的 构造函数 和 析构函数 ,
  • 类 成员变量 的 构造函数 和 析构函数 ;

2、调用规则

在 继承 + 组合 的情况下 , 构造函数 与 析构函数 调用规则如下 :

  • 构造函数 : 父类 -> 成员 -> 自身 ;
    • 首先 , 调用 父类 构造函数 ;
    • 然后 , 调用 成员 构造函数 ; 也就是 成员变量 类型的 构造函数 ;
    • 最后 , 调用 自己 构造函数 ; 自身定义的 构造函数 ;
  • 析构函数 : 自身 -> 成员 -> 父类 ;
    • 首先 , 调用 自己 析构函数 ; 自身定义的 析构函数 ;
    • 然后 , 调用 成员 析构函数 ; 也就是 成员变量 类型的 析构函数 ;
    • 最后 , 调用 父类 析构函数 ;

二、完整代码示例分析


1、代码分析

在下面的代码中 ,

继承关系 : C 类 继承了 B 类 class C : public B , B 类 继承了 A 类 class B : public A ;

组合关系 : D 类 是一个普通类 , 在 C 类中维护了一个 D 类成员变量 ;

cpp 复制代码
class C : public B {
public:
	C(int a, int b, int c) : B(a, b)
	{
		this->z = c;
		cout << "C 构造函数调用" << endl;
	}
	~C()
	{
		cout << "C 析构函数调用" << endl;
	}
public:
	int z;
	D d;
};

可根据下面的调用规则 , 分析出 C 类对象中 , 涉及到的 父类构造/析构函数 , 自身构造/析构函数 , 成员变量 构造/析构函数 的调用顺序 ;

  • 构造函数调用顺序 : 父类 -> 成员 -> 自身 ;
  • 析构函数调用顺序 : 自身 -> 成员 -> 父类 ;

2、代码示例

代码示例 :

cpp 复制代码
#include "iostream"
using namespace std;

class A {
public:
	A(int a)
	{
		this->x = a;
		cout << "A 构造函数调用" << endl;
	}
	~A()
	{
		cout << "A 析构函数调用" << endl;
	}
public:
	int x;
};

class B : public A {
public:
	B(int a, int b) : A(a)
	{
		this->y = b;
		cout << "B 构造函数调用" << endl;
	}
	~B()
	{
		cout << "B 析构函数调用" << endl;
	}
public:
	int y;
};

class D
{
public:
	D()
	{
		cout << "D 构造函数调用" << endl;
	}
	~D()
	{
		cout << "D 析构函数调用" << endl;
	}
};

class C : public B {
public:
	C(int a, int b, int c) : B(a, b)
	{
		this->z = c;
		cout << "C 构造函数调用" << endl;
	}
	~C()
	{
		cout << "C 析构函数调用" << endl;
	}
public:
	int z;
	D d;
};

int main() {

	C obj(1, 2, 3);

	cout << "obj.x = " << obj.x <<
		" , obj.y = " << obj.y <<
		" , obj.z = " << obj.z << endl;


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 : 下面的代码中 , 分析构造函数调用顺序 ;

  • A 和 B 的构造函数 , 是 父类构造函数 ;
  • D 构造函数 , 是 成员构造函数 ;
  • C 构造函数 , 是 自身构造函数 ;

构造函数的调用顺序为 : 父类 -> 成员 -> 自身 , 符合上述的调用原则 ;

然后分析 析构函数 调用顺序 ;

  • C 析构函数 , 是 自身构造函数 ;
  • D 析构函数 , 是 成员构造函数 ;
  • A 和 B 的析构函数 , 是 父类构造函数 ;

析构函数的调用顺序为 : 自身 -> 成员 -> 父类 , 符合上述的调用原则 ;

cpp 复制代码
A 构造函数调用
B 构造函数调用
D 构造函数调用
C 构造函数调用
obj.x = 1 , obj.y = 2 , obj.z = 3
Press any key to continue . . .
C 析构函数调用
D 析构函数调用
B 析构函数调用
A 析构函数调用
相关推荐
lijiachang03071822 分钟前
设计模式(一):单例模式
c++·笔记·学习·程序人生·单例模式·设计模式·大学生
<但凡.25 分钟前
题海拾贝:蓝桥杯 2020 省AB 乘法表
c++·算法·蓝桥杯
DogDaoDao1 小时前
leetcode 面试经典 150 题:矩阵置零
数据结构·c++·leetcode·面试·矩阵·二维数组·矩阵置零
计科土狗2 小时前
前缀和与差分
c++·算法
午言若3 小时前
MYSQL 架构
c++·mysql
羑悻的小杀马特5 小时前
【AIGC篇】畅谈游戏开发设计中AIGC所发挥的不可或缺的作用
c++·人工智能·aigc·游戏开发
闻缺陷则喜何志丹5 小时前
【C++动态规划】1105. 填充书架|2104
c++·算法·动态规划·力扣·高度·最小·书架
初学者丶一起加油6 小时前
C语言基础:指针(数组指针与指针数组)
linux·c语言·开发语言·数据结构·c++·算法·visual studio
CodeClimb7 小时前
【华为OD-E卷-租车骑绿道 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
易码智能7 小时前
【RealTimeCallBack】- KRTS C++示例精讲(4)
c++·定时器·kithara·windows 实时套件·krts