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

news2025/1/16 1:34:20

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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;
}

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/926829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14.4K Star,一款外观漂亮、运行快速、动画细腻的开源免费UI组件库

之前给大家推荐了很多后台模版&#xff0c;有读者希望推荐一些跟通用的好看组件&#xff0c;毕竟出了后台还有很多其他场景嘛。所以&#xff0c;今天继续给大家推荐一个广受好评的UI组件库&#xff1a;NextUI 主要特性 NextUI的主要目标是简化开发流程&#xff0c;为增强的用户…

Docker file解析

文章目录 简介构建的三步骤Docker执行Dockerfile的大致流程DockerFile常用保留字指令创建第一个Dockerfile镜像的缓存特性 Docker file 解析 简介 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本&#xff0c;记录了镜像构…

PHP竞赛管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 竞赛管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88244066 二、功能介绍 后…

【校招VIP】前端校招考点之页面转换算法

考点介绍&#xff1a; 在地址映射过程中&#xff0c;若在页面中发现所要访问的页面不在内存中&#xff0c;则产生缺页中断。当发生缺页中断时&#xff0c;如果操作系统内存中没有空闲页面&#xff0c;则操作系统必须在内存选择一个页面将其移出内存&#xff0c;以便为即将调入的…

C++信息学奥赛1147:最高分数的学生姓名

#include <iostream> #include <string> using namespace std; int main() {int n;// 输入一个整数ncin>>n;cin.ignore();string arr;string str;int max0;int fen;// 循环读取n个评分和对应的字符串for(int i0;i<n;i){cin>>fen>>arr;if(fen&…

分布式事务(7):SpringCloud2.0整合LCN

目前LCN版本已经升级为4.0了,但是官方没有SpringCloud2.0的demo案例。 因为LCN本身是开源的,有些大神对LCN框架源码做修改,可以支持SpringCloud2.0版本。 下载地址:https://download.csdn.net/download/u013938578/88251904 1 下载LCN服务端源码 https://download.csdn.…

ubuntu22.04.1-live的vm虚拟机扩展磁盘

1、虚拟机分配硬盘100G&#xff0c;进系统df -h根目录只有50G 2、查看所有块设备 lsblk 3、 查看卷信息vgdisplay 4、在原有基础上增加49G lvextend -L 49G /dev/ubuntu-vg/ubuntu-lv 5、调整大小 resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

深入理解线性回归模型的评估与优化方法

文章目录 &#x1f340;引言&#x1f340;模型评估方法&#x1f340;均方误差&#xff08;MSE&#xff09;&#x1f340;均方根误差&#xff08;RMSE&#xff09;&#x1f340;绝对平均误差&#xff08;MAE&#xff09;&#x1f340;模型优化策略&#x1f340;特征工程&#x1…

百度开源2019新型冠状病毒RNA预测算法

为应对2019年新型冠状病毒&#xff08;2019-nCoV&#xff09;爆发&#xff0c;中国科技巨头百度开源了其RNA&#xff08;核糖核酸&#xff09;预测算法LinearFold。该工具可以显著加快病毒RNA二级结构的预测时间&#xff0c;为一线研究人员提供在危机时期更好地了解病毒和开发靶…

多线程学习之多线程的三种实现方式及应用

一、继承Thread类 1.1方法 方法名说明void run()在线程开启后&#xff0c;此方法将被调用执行void start()使此线程开始执行&#xff0c;Java虚拟机会调用run方法() run()方法和start()方法的区别&#xff1a; run()&#xff1a;封装线程执行的代码&#xff0c;直接调用&am…

PDF如何转ppt?PDF转ppt的方法

PDF是一种广泛应用于文档传输和存储的格式&#xff0c;然而&#xff0c;在某些情况下&#xff0c;我们可能需要将PDF文件转换为PPT&#xff0c;以便更加灵活地编辑和展示内容。那么&#xff0c;PDF如何转ppt呢?在本文中&#xff0c;我们将介绍几种常用的方法和工具&#xff0c…

智慧编织非遗篇章,AI激活文化精髓的未来!

引言&#xff1a;非遗&#xff0c;指一系列与人类活动、传统技艺、知识体系和社会实践有关的非物质文化元素。它是一个民族难以估量的瑰宝&#xff0c;在中国悠久的历史中&#xff0c;古代先民在劳动生活中创造了大量非物质文化遗产&#xff0c;例如陶瓷的烧制、刺绣、织布技艺…

大隐隐于市,分享5个不为人知的小众软件

​ 电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。今天分享5个实用的软件&#xff0c;简单实用&#xff0c;效果拉满&#xff0c;堪称工作生活必备&#xff0…

Modbus通信协议详解

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议&#xff0c;控制器相互之间、控制器经由网络&#xff08;例如以太网&#xff09;和其它设备之间可以通信。它已经成为一通用工业标准。有了它&#xff0c;不同厂商生产的控制设备可以连成工业网络&#xff0c;进行集…

Google代码风格

下面的网站收录了Google的代码风格&#xff0c;有时间看看。 Google Style Guides 写代码要不断思考&#xff0c;多看多写呀&#xff01;

获取一个月有多少天

实现方式&#xff1a; 已知月份&#xff0c;得到这个月的第一天和最后一天作为查询条件查范围内的数据 new Date(year, month, date, hrs, min, sec)&#xff0c;new Date 可以接受这些参数创建一个时间对象 其中当我们把 date 设置为 0 的时候&#xff0c;可以直接通过 getD…

力扣:74. 搜索二维矩阵(Python3)

题目&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返…

瞬态电压抑制器(TVS)汽车级 SZESD9B5.0ST5G 工作原理、特性参数、封装形式

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…

windows查看本机host地址

windows查看本机host地址 %windir%\system32\drivers\etc

SemrushBot蜘蛛爬虫屏蔽方式

查看访问日志时候发现有SemrushBot爬虫 屏蔽方法&#xff1a; 使用robots.txt文件是一种标准的协议,用于告诉搜索引擎哪些页面可以和不能被爬取,如想禁止Googlebot爬取整个网站的话,可以在该文件中添加以下内容: User-agent: Googlebot Disallow: / 对于遵循robots协议的蜘蛛…