C++ 派生类的析构函数

派生类的析构函数的功能是在该类对象消亡之前进行的一些必要的清理工作。析构函数没有类型,也没有参数。

在派生过程中,基类的析构函数也不可以继承下来,如果需要析构的话,就要在派生类中声明新的析构函数。派生类析构函数的声明方法与没有继承关系中析构函数的析构函数的声明方法完全相同,只要在函数体中负责把派生类新增的非对象成员的清理工作做好就够了,系统会自己调用基类及对象成员的析构函数来对基类及对象成员进行清理。但她的执行次序和构造函数相反,首先执行析构函数的函数体,然后对派生类新增的类类型的成员对象进行清理,最后对所有从基类继承来的成员进行清理。这些清理工作分别是执行派生类析构函数、调用类类型的派生类对象成员所在类的析构函数和调用基类析构函数。对于这些析构函数的调用次序与对构造函数的调用次序完全相反。

如果没有显式声明某个类的析构函数,这种情况下,编译系统会自动为每个类都生成一个默认的析构函数,并在对象生存期结束时自动调用。这样自动生成的析构函数的函数体是空的,但并非不做任何事情,它会隐含地调用派生类对象成员所在类的析构函数和调用基类的析构函数。

【例】派生类析构函数举例

class B1//基类B1,构造函数有参数
{
public:B1(int i){cout << "基类B1的构造函数" << i << endl;}~B1(){cout << "基类B1的析构函数" << endl;}};class B2//基类B2,构造函数有参数
{
public:B2(int j){cout << "基类B2的构造函数" << j << endl;}~B2(){cout << "基类B2的析构函数" << endl;}};class B3//基类B3,构造函数无参数
{
public:B3(){cout << "基类B3的构造函数" << endl;}~B3(){cout << "基类B3的析构函数" << endl;}
};class D :public B2, public B1, public B3//派生类D,注意基类名的顺序
{
public://派生类的公有成员D(int a, int b, int c, int d) : b2(d), B2(b), B1(a), b1(c) {}//注意类名的个数与顺序,注意成员对象名的个数与顺序
private://派生类的私有成员对象B1 b1;B2 b2;B3 b3;
};int main()
{D d(1, 2, 3, 4);return 0;
}

运行结果:
在这里插入图片描述

分析:

程序中,给3个基类分别加入了析构函数,派生类没有做任何改动,仍然使用的是由系统提供的默认的析构函数。程序在执行时,首先执行派生类的构造函数,然后执行派生类的析构函数。派生类默认的析构函数又分别调用了成员对象及基类的析构函数,这时次序刚好和构造函数执行时相反。

【例2】

class B
{
public:B(int x = 0) :x(x){cout << "基类B构造函数" << endl;}B(B& b){cout << "基类B的拷贝构造函数" << endl;x = b.x;}~B(){cout << "基类B的析构函数" << endl;}void show1(){cout << "x的值为:" << x << endl;}int getX(){return x;}
private:int x;
};class D :public B
{
public:D(int a, int b, int c, int d) :B(a), y(b), z(c), v(d){cout << "派生类D的构造函数" << endl;}D(D& dd) :B(dd){cout << "派生类D的拷贝构造函数" << endl;x = dd.x;y = dd.y;z = dd.z;v = dd.v;}~D(){cout << "基类D的析构函数" << endl;}void show2(){cout << "x的值为:" << getX() << endl;cout << "y的值为:" << y << endl;cout << "z的值为:" << z << endl;cout << "v的值为:" << v << endl;}
private:int x;int y;int z;int v;
};int main()
{B b(5);b.show1();D d(1, 2, 3, 4);d.show2();D dd(d);dd.show2();return 0;
}

运行结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

户外组网摆脱布线困扰,工业5G网关实现无人值守、远程实时监控

在物联网通信技术发达的2023&#xff0c;网络覆盖对所及之处的全面覆盖&#xff0c;科技发展的促使下很多高危户外场景也在思考如何利用无线技术提高人员安全及现场无人化管理。 煤矿是我们国家不可缺少的重要能源&#xff0c;其开采过程的危险系数也是众所皆知的&#xff0c;…

HbuildX生成安卓签名证书

HbuildX生成安卓签名证书 安装和配置JRE环境 根据此链接安装和配置JRE环境 生成签名证书 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystoretestalias是证书别名&#xff0c;可修改为自己想设置的字符&#xff0c;建议…

策略模式【Strategy Pattern】

刘备要到江东娶老婆了&#xff0c;走之前诸葛亮给赵云&#xff08;伴郎&#xff09;三个锦囊妙计&#xff0c;说是按天机拆开解决棘手问题&#xff0c; 嘿&#xff0c;还别说&#xff0c;真是解决了大问题&#xff0c;搞到最后是周瑜陪了夫人又折兵呀&#xff0c;那咱们先看看…

深度学习(37)—— 图神经网络GNN(2)

深度学习&#xff08;37&#xff09;—— 图神经网络GNN&#xff08;2&#xff09; 这一期主要是一些简单示例&#xff0c;针对不同的情况&#xff0c;使用的数据都是torch_geometric的内置数据集 文章目录 深度学习&#xff08;37&#xff09;—— 图神经网络GNN&#xff08…

volte端到端问题分析(一)

1、MME专载保持功能验证 **描述&#xff1a;**当无线环境较差时&#xff0c;有可能由于“Radio_Connection_with_UE_Lost” 原因造成的VoLTE通话掉话&#xff0c;如果UE发生RRC重建成功&#xff0c;手机将不会掉话。 对MME1202进行功能验证&#xff1a;开启后&#xff0c;MME专…

在时间和频率域中准确地测量太阳黑子活动及使用信号处理工具箱(TM)生成广泛的波形,如正弦波、方波等研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

喜报!诚恒科技与赛时达科技达成BI金蝶云星空项目合作

随着全球数字化浪潮轰轰烈烈袭来&#xff0c;仅仅凭借手工处理的方式难以在庞大的数据海洋中精准获取信息、把握市场需求、了解目标用户&#xff0c;为企业创新提供强有力的支持。深圳赛时达科技有限公司&#xff08;简称赛时达科技&#xff09;希望通过数字化转型实现从手工处…

Blazor 调试控制台

文章目录 设置 设置 Blazor项目启动之后&#xff0c;有好几种项目设置&#xff0c;我其实想要这一种控制台 直接Console.log就行了 public void LoginBtn(){Console.WriteLine("登录");//navigationManager.NavigateTo("/index");}

Unity-Linux部署WebGL项目MIME类型添加

在以往的文章中有提到过使用IIS部署WebGL添加MIME类型使WebGL项目在浏览器中能够正常加载&#xff0c;那么如果咱们做的是商业项目&#xff0c;往往是需要部署在学校或者云服务器上面的&#xff0c;大部分情况下如果项目有接口或者后台管理系统&#xff0c;后台基本都会使用Lin…

数据结构(一):顺序表详解

在正式介绍顺序表之前&#xff0c;我们有必要先了解一个名词&#xff1a;线性表。 线性表&#xff1a; 线性表是&#xff0c;具有n个相同特性的数据元素的有限序列。常见的线性表&#xff1a;顺序表、链表、栈、队列、数组、字符串... 线性表在逻辑上是线性结构&#xff0c;但…

2021年09月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数字判断 输入一个字符,如何输入的字符是数字,输出yes,否则输出no 输入 一个字符 输出 如何输入的字符是数字,输出yes,否则输出no 样例1输入 样例1输入 5 样例1输出 yes 样例2输入 A 样例2输出 no 下面是一个使用C语言编写的数字判断程序的示例代码,根据输入的字符…

(5)所有角色数据分析页面的构建-5

所有角色数据分析页面&#xff0c;包括一个时间轴柱状图、六个散点图、六个柱状图(每个属性角色的生命值/防御力/攻击力的max与min的对比)。 """绘图""" from pyecharts.charts import Timeline from find_type import FindType import pandas …