C++多态虚析构和纯虚析构

news2024/11/28 6:33:19

虚析构和纯虚析构

多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码
注释:父类指针在释放时,只会调用父类自己的析构函数,而无法调用子类的析构函数

解决方式:将父类的析构函数改为虚析构或者纯虚析构

虚析构和纯虚析构共性:

  • 可以解决父类指针释放子类对象
  • 都需要有具体的函数实现

虚析构和纯虚析构区区别:

  1. 如果是纯虚析构,则该类属于抽象类,无法实例化对象

为什么需要虚析构

#include<iostream>
#include<string>
using namespace std;



//虚析构和纯虚析构
class Animal
{

public:
	Animal()
	{
		cout << "调用了父类的构造函数" << endl;	
	}

	~ Animal()
	{
		cout << "调用了父类的析构函数" << endl;
	}
	virtual void speak() = 0;//纯虚函数
};


class Cat :public Animal
{
public:
	string *m_Name;
	//在子类的构造函数,加入小猫的姓名
	Cat(string name)
	{
		cout << "调用了子类-小猫类的构造函数" << endl;
		m_Name = new string(name);//在堆区创建
	}

	~Cat()
	{
		if (m_Name != NULL)
		{
			delete m_Name;
			m_Name = NULL;

			cout<<"调用了子类-小猫类的析构函数"<<endl;
		}
	
	}


	virtual void speak()
	{
	
		cout << *m_Name<<"小猫在说话" << endl;//解引用
	
	}

};
void testSpeak()
{
	Animal *animal = new Cat("Tom");//有参构造函数
	animal->speak();
	delete animal;


}




int main()
{

	testSpeak();



}

结果:

没有调用子类的构造函数
在这里插入图片描述
原因:是因为我们用父类指针指向了子类对象,所以释放父类指针时,并不会调用子类的析构代码

父类指针在析构时候 不会调用子类中析构函数,导致子类如果有堆区属性,出现内存泄漏

解决办法:

在父类析构函数前加入关键字 virtual

//虚析构和纯虚析构
class Animal
{

public:
	Animal()
	{
		cout << "调用了父类的构造函数" << endl;	
	}

	virtual ~ Animal()
	{
		cout << "调用了父类的析构函数" << endl;
	}
	virtual void speak() = 0;//纯虚函数
};

虚析构函数用途

可以利用虚析构函数解决父类指针在释放子类问题时,内存存在泄露的问题
在这里插入图片描述

纯虚析构

纯虚析构既要声明也需要实现

  • 类内声明
  • 类外定义实现

有了纯虚析构 之后 ,这个类也属于抽象类,无法实例化对象

属性开辟到了堆区

//虚析构和纯虚析构
class Animal
{

public:
	Animal()
	{
		cout << "调用了父类的构造函数" << endl;	
	}

	//virtual ~ Animal()
	//{
	//	cout << "调用了父类的析构函数" << endl;
	//}

	virtual ~Animal() = 0;//纯虚析构




	virtual void speak() = 0;//纯虚函数
};

Animal::~Animal()
{

	cout << "调用了父类的纯虚析构函数" << endl;

}

结果

在这里插入图片描述

总结:

  1. 虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
  2. 如果子类中没有堆区数据,可以不写为虚析构或纯虚析构
  3. 拥有纯虚析构函数的类也属于抽象类

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

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

相关文章

诚实守信、专业严谨、合规自律、公开透明——嘉泰实业

每一次暖心的沟通都是一次公益,真诚不会因为它的渺小而被忽略;每一声问候都是一次公益,善意不会因为它的普通而被埋没。熟悉嘉泰实业的人都知道,这家企业不但擅长在金融理财领域里面呼风唤雨,同时也非常擅长在公益事业当中践行,属于企业的责任心,为更多有困难的群体带来大爱的传…

结构体的简单介绍(2)

目录 结构体的特殊声明 结构体的自引用 结构体的特殊声明 在声明结构的时候&#xff0c;可以不完全的声明。 比如&#xff1a; struct {int a;char b;float c; }x; 以上结构在声明的时候省略掉了结构体标签&#xff08;tag&#xff09;。 那么会有什么影响呢&#xff1f…

Qt CMake 中国象棋程序实现

前驱课程 C自学精简实践教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; Qt 入门实战教程&#xff08;目录&#xff09; 项目初衷 为学习 Qt 的人提供一个合适的有一定难度的综合型练习项目。 在学会写代码之前&#xff0c;先看别人怎么写的代码。深入…

计算机竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

基于Java+SpringBoot+Vue前后端分离论坛系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

2000-2022年上市公司融资约束指数(KZ、SA、FC和WW指数)(含原始数据、方法说明和计算结果)

2000-2022年上市公司融资约束指数&#xff08;KZ、SA和WW指数&#xff09;&#xff08;含原始数据和计算结果&#xff09; 1、时间跨度&#xff1a;2000-2022年 2、区域范围&#xff1a;沪深A股上市公司 3、指标说明&#xff1a; 证券代码、证券简称、统计截止日期、是否剔…

SSD202D-编译固件重启无法进入kernel

今天打包发现我的固件一直重启,我一直以为是没升级好; 然后根据log发现在进入kernel的时候挂掉了 汇编都暴出来了,这就很焦灼 我查看对比正常启动的log,boot一模一样,等了很久之后会有概率进系统 我要查看问题在哪里,搞得焦头烂额 1.我用以前的固件确认一下问题是不是在板…

高忆管理:证券账户国债逆回购怎么操作?

国债逆回购的本质就是一种短期贷款&#xff0c;个人经过国债回购商场把自己的资金借出去&#xff0c;取得固定的利息收益&#xff0c;那么&#xff0c;证券账户国债逆回购怎样操作&#xff1f;怎样在股票账户上买国债逆回购&#xff1f;下面高忆管理为我们准备了相关内容&#…

Editplus打开当前文件所在的文件夹

一个小技巧&#xff1a;Editplus打开当前文件所在的文件夹&#xff0c;备忘记录一下。 1、打开目录窗口 AltShift3&#xff0c;打开目录窗口&#xff08;Directory Window&#xff09;&#xff0c;这是开关键&#xff0c;再按一次会关闭目录窗口。 2、打开文件夹 在“目录窗…

git代码撤销回滚只看这一篇就足够了!

1. 代码撤销 目前大家都在使用git&#xff0c;在项目开发中&#xff0c;总会遇到提交的代码有问题&#xff0c;想要撤销回滚的操作&#xff0c;关于撤销回滚代码单独给大家介绍一下。   正常的提交代码如果要提交到远程仓库有下边3步命令&#xff1a; git add . ------------…

软件测试/测试开发丨Web自动化 测试用例流程设计

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27173 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1…

RobotFramework自动化测试框架系列学习-----(一)简介、搭建、运行

一、简介 基于Python的关键字驱动的自动化框架。 1.基于Python&#xff1a;就是由python语言开发的这个框架。 2.关键字驱动&#xff1a;关键字驱动测试又称为表格驱动测试&#xff0c;是自动化测试的一种方法&#xff0c;是数据测试的一种改进方法。关键字驱动主要包括测试步骤…

利用vba处理Excel表格数据实现键值转化,适用于将编码转化成对应的文本

最近遇到了一个甲方需要提供系统登录的用户名单和对应的角色权限内容。无奈直接从数据库导出的数据对应的都是编码&#xff0c;没有转成中文&#xff0c;想着偷个懒能不能直接用Excel直接转&#xff0c;网上看了一下有修改单元格格式的&#xff0c;但需要编码是2到3个。多的就用…

HyperDock 1.8.0.10(Dock优化工具)

HyperDock 是一款为 macOS 设计的实用工具&#xff0c;它提供了许多方便快捷的功能&#xff0c;使您能够更高效地管理和操作应用程序窗口。 首先&#xff0c;HyperDock 提供了类似于 Windows 7 的任务栏预览功能。当您将鼠标悬停在应用程序图标上时&#xff0c;会显示该应用程…

C++入门基础知识总结(超详细思维导图)

开门见山 思维导图奉上 引用和指针的区别宏宏的优缺点 C中替代宏C和C的区别 &#xff01;&#xff01;&#xff01; 详细部分参考该博客&#xff1a;从C快速入门C (命名空间、引用、函数重载&#xff09; &#xff01;&#xff01;&#xff01; 引用和指针的区别 ● 引用就…

cin、cin.getline()、getline()的用法【C++】

一、cin>> 用法1&#xff1a;输入一个数字或字符 #include <iostream> using namespace std; int main () {int a,b;cin>>a>>b;cout<<ab<<endl;return 0; } 用法2&#xff1a;接收一个字符串&#xff0c;遇“空格”、“TAB”、“回车”…

气导耳机有哪些品牌?市面上气传导耳机哪家好?

​随着人们对运动健康的重视&#xff0c;越来越多的人开始关注运动时佩戴的耳机。然而&#xff0c;传统的耳机在运动时往往会受到限制&#xff0c;而气传导耳机则可以避免这些问题&#xff0c;为用户带来更加舒适和便捷的使用体验。今天就来展开说说&#xff0c;市面上气传导耳…

【程序员必知必会3】ClickHouse和Hive究竟哪些区别

ClickHouse和Hive究竟哪些区别 ClickHouse和Hive都是用于大数据处理和分析的分布式存储和计算系统&#xff0c;但它们之间存在一些区别&#xff1a; 架构&#xff1a;ClickHouse采用列式存储和向量化执行引擎&#xff0c;可以实现亚秒级别的数据查询。而Hive采用基于Hadoop的数…

设置Linux CentOS7桥接模式连网

在虚拟机上安装centos7系统后&#xff0c;首要任务就是设置网络。 我们在文章《设置linux centos7连接网络》中讨论了如何设置NAT模式连网。本文讨论如何在设置好NAT模式后&#xff0c;调换为桥接模式。 仍采用图形化方式设置方法。 一、查看物理机网络 把虚拟机设置为桥接…

JDK源码解析-HashMap面试题

1. HashMap类 * HashMap底层数据结构(为什么引入红黑树、存储数据的过程、哈希碰撞相关问题)* HashMap成员变量(初始化容量是多少、负载因子、数组长度为什么是2的n次幂)* HashMap扩容机制(什么时候需要扩容&#xff1f; 怎么进行扩容&#xff1f;)* JDK7 与 Jdk8比较&#xff…