C++ 136类和对象_面像对像_多态_虚析构和纯虚析构

news2024/12/28 3:15:04

136类和对象_面像对像_多态_虚析构和纯虚析构
学习内容
1.抽象类
2.虚函数
3.纯虚函数
/4.虚析构 和 纯虚析构

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

动态多态满足条件
1.有继承关系
2.子类重写父类函数
3.用父类的函数指针 指向 子类的对象 AnimalBaseModel & animal

结果

代码

#include<iostream>
using namespace std;//cout 在这里,没有它会报错
#include<string>

//136类和对象_面像对像_多态_虚析构和纯虚析构
//学习内容
// 1.抽象类
// 2.虚函数
// 3.纯虚函数
// 4.虚析构 和 纯虚析构

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

//动态多态满足条件
//1.有继承关系
//2.子类重写父类函数
//3.用父类的函数指针 指向 子类的对象 AnimalBaseModel & animal

//动物父类,基类 抽象类
class AnimalBaseModel
{
public://公共
	string m_Remark;

	AnimalBaseModel()
	{
		cout << "AnimalBaseModel的构造函数在调用" << endl;
	}

	AnimalBaseModel(string name)
	{
		cout << "AnimalBaseModel的构造函数在调用_1" << endl;
	}

	//利用虚析构可以解决,父类指针释放子类对象时不干净的问题
	virtual ~AnimalBaseModel()
	{
		cout << "AnimalBaseModel的析构函数在调用" << endl;
	}

	//虚析构 和 纯虚析构 只能有一个
	//纯虚析构
	//virtual ~AnimalBaseModel() = 0;

	/// <summary>
	/// virtual 函数 就可以实现 地址晚绑定
	/// 要子类重写这个 函数就是 virtual 函数
	/// </summary>
	virtual void Speak()
	{
		cout << "动物在说话" << endl;
	}

	//当有了 纯虚函数 这个类就是抽象类
	//抽象类 不能实例化

	//纯虚函数, 子类一定要重写此函数,否则子类也不能实例化,因为子类也是抽象类
	virtual bool Move() = 0;

	virtual void Eat() = 0;
};

//AnimalBaseModel::~AnimalBaseModel()
//{
//	cout << "AnimalBaseModel的析构函数在调用" << endl;
//}

//猫子类 继承 了父类
class CatModel : public AnimalBaseModel
{
public:

	string *m_Name;

	CatModel()
	{

	}

	CatModel(string name)
	{
		m_Name = new string(name);
		cout << "CatModel的构造函数在调用" << endl;
	}

	~CatModel()
	{
		cout << "CatModel的析构函数在调用" << endl;
		if (m_Name != NULL)
		{
			delete m_Name;
			m_Name = NULL;
		}
	}

	void Speak()
	{
		cout << "小猫[" << *m_Name << "]在说话" << endl;
	}

	bool Move()
	{
		cout << "小猫[" << *m_Name << "]在移动" << endl;
		return true;
	}

	void Eat()
	{
		cout << "小猫[" << *m_Name << "]在吃饭" << endl;
	}
};

//地址早绑定 在编译阶段确定函数的地址

//动态多态满足条件
//1.有继承关系
//2.子类重写父类函数
//3.用父类的函数指针 指向 子类的对象 AnimalBaseModel & animal

void doSpeak(AnimalBaseModel& animal)// 用父类的函数指针 指向 子类的对象
{
	animal.Speak();
}

int main()
{
	AnimalBaseModel * animal = new CatModel("Tam");
	animal->Speak();
	//父类指针在析构时候,不会调用子类中析构函数,导致子类如果有堆区属性,出现内存泄漏
	//解决问题的方法是将父类的析构函数改成虚析构
	delete animal;

	system("pause");
}

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

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

相关文章

【网络安全】XML-RPC PHP WordPress漏洞

未经许可,不得转载。 文章目录 前言WordPressWordPress中的Xmlrpc.php利用前提:Xmlrpc可访问深度利用1、用户名枚举2、跨站点端口攻击(XSPA)或端口扫描3、使用xmlrpc.php进行暴力攻击前言 本文将解释xmlrpc.php WordPress 漏洞及利用方式,并以三种攻击方法进行阐发: 1、…

【焕新】同为科技(TOWE)23周年庆典

每年的8月23日&#xff0c;都是一个值得铭记、守护、欢庆的日子。这一天同为科技&#xff08;TOWE&#xff09;迎来公司成立23周年纪念日&#xff0c;是属于TOWE品牌向前、长远的里程碑。从2001到2024&#xff0c;从品牌与文化&#xff0c;从产品到服务。 同为科技&#xff08;…

GB28181国标联网网关:助力视频设备与平台的全面互联互通

联网网关概述 在安防行业视频监控联网项目中&#xff0c;经常会有视频数据的跨部门、跨系统共享需求&#xff0c;随着联网需求的增多&#xff0c;在行业内国标GB28181协议又是最为常见应用最为广泛的联网协议&#xff0c;这也使得无论是设备厂家、后端平台厂家都开发出了符合各…

Linux的yum包管理工具(在线安装)

Linux的软件从哪里下载&#xff1f; 我们用的Linux系统都是国外的&#xff0c;所以下载软件自然从国外下载。但是访问国外网址太慢了&#xff0c;有没有什么办法快一点呢&#xff1f; 有&#xff01; 啊&#xff0c;还有这么美的事情&#xff1f;快点告诉我&#xff01; 好…

Android手机安装Kali系统并配置ddns-go

正文共&#xff1a;777 字 15 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了如果在Linux系统使用ddns-go实现IPv6地址的自动解析&#xff08;使用ddns-go实现自动配置IPv6的DDNS&#xff09;&#xff0c;但在日常使用中&#xff0c;如果使用服务器开虚机的方式…

Web入门-03.HTTP协议-概述

一.HTTP协议 在上一节中的请求路径复制之后&#xff0c;我们粘贴到记事本中会看到http://localhost:8080/hello。这是因为使用了http协议。 HTTP&#xff1a;超文本传输协议。定义了浏览器和服务器之间数据传输的规则。该规则就是浏览器与服务器之间数据传输的格式。 客户端浏…

超详细Git基本命令使用(二)

&#x1f600;前言 本篇博文是关于 Git基本命令的使用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f6…

QJson的写入和解析基本操作

一、QJson简介 QJson 是一个用于处理 JSON&#xff08;JavaScript Object Notation&#xff09;数据的 C 库 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式 JSON 的语法简洁明了&#xff0c;使用人类可读的文本格式来表示数据 它由键值…

CSS3视图过渡动画

概述 网站的主题切换无非就是文字、背景图片或者颜色,我们可以先来看下 Element UI 官网的切换主题的动效: PS:Antdesign UI的主题切换动画也是大同小异。 实现的两种方式 CSS 为主 <script setup> const changeTheme = (e) => {if (document.startViewTransi…

IBM退出中国,LabVIEW未来走向何方?

IBM作为全球科技行业的领军企业之一&#xff0c;近日宣布退出中国市场的决定引起了广泛关注。IBM的退出不仅仅是企业战略的调整&#xff0c;还反映了全球经济和政治环境的变化。深入分析IBM退出中国的原因&#xff0c;并预测NI&#xff08;National Instruments&#xff09;未来…

深入探索蒙特卡洛树搜索(MCTS):原理、应用与优化

深入探索蒙特卡洛树搜索&#xff08;MCTS&#xff09;&#xff1a;原理、应用与优化 引言 在人工智能与游戏开发领域&#xff0c;蒙特卡洛树搜索&#xff08;Monte Carlo Tree Search, MCTS&#xff09;作为一种高效的启发式搜索算法&#xff0c;凭借其卓越的性能和广泛的应用…

Spring security 密码加密使用

一、密码加密 2011年12月21日&#xff0c;有人在网络上公开了一个包含600万个CSDN 用户资料的数据库&#xff0c;数据全部为明文储存&#xff0c;包含用户名、密码以及注册邮箱。事件发生后CSDN 在微博、官方网站等渠道发出了声明、解释说此数据库系2009 年备份所用&#xff0c…

网易大数据模型

网易大数据平台 https://sf.163.com/

番茄叶部病害-目标检测数据集(包括VOC格式、YOLO格式)

番茄叶部病害-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1hZdoXcYEcJaw9spazrxGZg?pwdtsaw 提取码&#xff1a;tsaw 数据集信息介绍&#xff1a; 共有 534 张图像和一一对应的标注文件 标…

【Kotlin设计模式】Kotlin实现外观模式

前言 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口&#xff0c;使得这一子系统更加容易使用。它将复杂的子系统封装在一个简单的接口后面&#xff0c;从而降低了客…

边缘物联网平台AIoTedge推荐

AIoTedge是一个创新的智能边缘计算平台&#xff0c;它通过边云协同的架构设计&#xff0c;实现了多点部署和分布式计算&#xff0c;提高了数据处理的速度和效率&#xff0c;同时确保了数据的安全性和隐私性。平台具备强大的分布式AIoT处理能力&#xff0c;适用于多种场景&#…

移动端+PC端源码,智慧城管执法系统,后端框架:springboot,移动端:uniapp

市管理综合执法管理平台实现执法办案、业务全流程在线办理&#xff0c;依托移动端PC端的“两端”应用模式&#xff0c;保障能够通过信息化手段进行日常的执法办案工作&#xff0c;强化执法监督功能。提供了案件在线办理、当事人信用管理、文书电子送达、沿街店铺分析等功能&…

2024-如何在低版本Mac OS安装合适的xcode-详细的技术篇

2024-如何在低版本Mac OS安装合适的xcode-详细的技术篇 1. 最烦人的是我不想升降我的macos系统&#xff0c;但是我是一名程序猿我想要玩IOS开发&#xff0c;那就需要下载对应的XCode的编译器。就会出现下面的情况&#xff1f;&#xff1f; 就会出现这样子的情况 原因是我的版…

算法-容斥原理

venn图&#xff1a; 如何求三个圆圈的面积之和&#xff1f; 此时&#xff0c;||不代表绝对值&#xff0c;代表集合的个数 解题思路&#xff1a; 实际上&#xff0c;我们不需要知道每个集合中的元素具体是什么&#xff0c;只需要知道每个集合的大小 例如 &#xff0c;表示10以…

物联网通讯协议MQTT、NB-IOT、Zigbee、CoAP、RFID、BLUETOOTH、NFC、4G和HTTP

物联网协议集 一、按网络四层协议分类 NB-IoT&#xff0c;LORA&#xff0c;WIFI&#xff0c;蓝牙&#xff0c;zigbee&#xff0c;4G都是物理层的&#xff0c;这几个都需要芯片模组支持&#xff08;硬件支持&#xff09; 而MQTT&#xff0c;COAP&#xff0c;HTTP都是应用层协议…