【C/C++】继承中构造函数与析构函数执行的顺序

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


一、继承中构造函数与析构函数执行的顺序

先定义一个父类,在构造函数和析构函数中输出文本

class CFather
{
public:
	CFather()
	{
		cout << "执行构造函数CFather" << endl;
	}
	~CFather()
	{
		cout << "执行析构函数~CFather" << endl;
	}

};

然后再定义一个子类继承该父类,也在构造函数和析构函数中输出文本

class CSon:public CFather
{
public:
	CSon()
	{
		cout << "执行构造函数CSon" << endl;
	}
	~CSon()
	{
		cout << "执行析构函数~CSon" << endl;
	}
};

在主函数中定义一个子类对象,输出结果为:

在这里插入图片描述

构造函数执行顺序:

  • 当派生类对象被创建时,首先会调用基类的构造函数,然后调用派生类自己的构造函数。
  • 构造函数的调用顺序是按照继承的顺序,从基类依次往下调用。即先调用最上层的基类,再依次往下调用

定义子类对象,优先调用的是子类的构造函数,在子类的初始化参数列表初始化父类和子类的成员,先调用父类的构造函数初始化父类成员,再初始化子类成员(与内存布局顺序一致)


析构函数执行顺序:

  • 析构函数的调用顺序与构造函数的调用顺序相反,先调用派生类自己的析构函数,再依次回溯调用基类的析构函数,直至最上层的基类的析构函数被调用

二、子类构造初始化参数列表,由编译器默认调用父类无参数构造

在子类创建对象的时候,调用子类的构造函数(注意这里并不是直接先执行父类的构造函数),但要先执行构造的初始化列表,在初始化列表中会默认调用父类的无参构造初始化父类成员

如父类只有带参数的构造

在子类的初始化参数列表中必须显式的指定父类构造进行初始化

#include <iostream>
#include <string>
using namespace std;
class CFather
{
public:
	int m_dad;
	int money;
	void funFather()
	{
		cout << __FUNCTION__ << endl;
	}
	CFather()
	{
		m_dad = 30;
		money = 500;
		cout << "执行构造函数CFather" << endl;
	}
	CFather(int a):m_dad(30),money(a)
	{
		cout << "执行构造函数CFather" << endl;
	}
	~CFather()
	{
		cout << "执行析构函数~CFather" << endl;
	}
};
class CSon :public CFather
{
public:
	int m_son;
	int money;
	//子类构造初始化参数列表,由编译器默认调用父类无参数构造
	CSon() :/*CFather(),*/ m_son(5), money(100)
	{
		cout << "执行构造函数CSon" << endl;
	}
	~CSon()
	{
		cout << "执行析构函数~CSon" << endl;
	}
};
int main()
{
	CSon son;
	cout << son.money << endl;
	cout << son.CFather::money << endl;
	return 0;
}

三、调用父类带参数构造函数,必须显式指定父类的构造

子类对象的生命周期结束后,因为是子类所以自动调用子类析构,当析构执行完了才会回收对象分配的空间,当然这个空间包含创建的父类的成员,那么回收父类成员前,自动调用父类的析构。

如果是new出来的子类对象,同理。

如果想调用父类带参数的构造函数,或者父类没有无参数构造,则必须显式指定父类的构造

#include <iostream>
#include <string>
using namespace std;
class CFather
{
public:
	int m_dad;
	int money;
	void funFather()
	{
		cout << __FUNCTION__ << endl;
	}
	CFather()
	{
		m_dad = 30;
		money = 500;
		cout << "执行构造函数CFather" << endl;
	}
	CFather(int a):m_dad(30),money(a)
	{
		cout << "执行构造函数CFather" << endl;
	}
	~CFather()
	{
		cout << "执行析构函数~CFather" << endl;
	}
};
class CSon :public CFather
{
public:
	int m_son;
	int money;
	//如果想调用父类带参数的构造函数,或者父类没有无参数构造,则必须显式指定父类的构造
	CSon(int a) :CFather(a),m_son(5),money(100)
	{
		cout << "执行构造函数CSon" << endl;
	}
	~CSon()
	{
		cout << "执行析构函数~CSon" << endl;
	}
};
int main()
{
	CSon son2(600);
	cout << son.money << endl;
	cout << son2.CFather::money << endl;
	return 0;
}

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值