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

news/2024/9/14 9:59:00/ 标签: c++, 笔记, 开发语言

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


http://www.ppmy.cn/news/1516905.html

相关文章

缓存三剑客(穿透,雪崩,击穿)理解

缓存穿透 概念理解 缓存穿透正如其名穿透&#xff0c;说明访问的数据在缓存和数据库里都没用&#xff0c;而且此时还大量的发起了访问&#xff0c;导致数据库崩溃 解决方法 一、第一种解决方法就是保存空值在数据库里面&#xff0c;但是这种情况会很消耗空间 二、第二种办…

利用Python对Excel数据进行条件筛选与排序

目录 一、Python与Excel数据处理的基础知识 1.1 Python中的Excel数据处理库 1.2 pandas库简介 二、使用pandas读取Excel数据 三、Excel数据的条件筛选 3.1 单条件筛选 3.2 多条件筛选 3.3 使用query方法 四、Excel数据的排序 4.1 单列排序 4.2 多列排序 五、案例分…

python模块05-json

3 请求数据提取&#xff1a;json 3.1 json类型数据 json对象&#xff1a;{key:calue} json数组&#xff1a;[1,2,3,4] 3.2 json模块 1&#xff09; json.loads 把Json格式字符串解码转换成Python对象&#xff08;json数组对应列表&#xff0c;json对象对应字典&#xff09…

Jenkins发邮件功能如何配置以实现自动化?

jenkins发邮件的设置指南&#xff1f;Jenkins怎么配置服务器&#xff1f; Jenkins作为一个流行的自动化服务器&#xff0c;其发邮件功能是通知团队成员构建状态的重要手段。AokSend将详细介绍如何配置Jenkins发邮件功能&#xff0c;以实现自动化通知。 Jenkins发邮件&#xf…

『 C++ 』线程库

文章目录 线程库线程的创建与销毁成员函数this_thread 命名空间线程的引用传值 互斥锁互斥锁的基本操作递归锁(可重入锁)定时互斥锁互斥锁管理器与互斥锁抛异常所引发的死锁问题 条件变量条件变量的等待条件变量的唤醒两个线程交替打印奇偶数 线程库 C标准库提供了一套完整的线…

探索 AWS Lightsail 与 EC2:如何选择适合你的云计算服务?

探索 AWS Lightsail 与 EC2&#xff1a;如何选择适合你的云计算服务&#xff1f; 随着云计算的广泛应用&#xff0c;AWS 提供了多种计算服务以满足不同的用户需求。对于初次接触 AWS 的用户来说&#xff0c;可能会在选择 AWS Lightsail 和 EC2 时感到困惑。这两者都提供了虚拟…

webpack打包优化方案

调试工具&#xff1a;安装webpack-bundle-analyzer打包可视化工具&#xff0c;可以看到打包文件大小&#xff0c;从而有针对性的优化。 npm install --save-dev webpack-bundle-analyzer。 方案一&#xff1a;将第三方依赖包使用cdn进行引入减小文件包体积&#xff08;例&…

Git的使用教程及常用语法01

git安装可以到官网上下载并安装&#xff0c;一直点点点就行 安装成功后可以在任意地方右键以终端的形式打开。 打开命令终端&#xff0c;输入git -v 查看git版本 一.配置全局用户名和邮箱 配置全局用户名&#xff1a; git config --global user.name "your username&…

利用TeamCity实现maven项目的CI/CD

1.什么是TeamCity&#xff1f; TeamCity 是一款由 JetBrains 开发的强大的持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续部署&#xff08;Continuous Deployment&#xff0c;CD&#xff09;工具。它帮助开发团队自动化构建、测试和部署过程&am…

Scratch的无限可能:突破项目大小与复杂度的界限

Scratch的无限可能&#xff1a;突破项目大小与复杂度的界限 Scratch&#xff0c;这个由麻省理工学院媒体实验室开发的编程平台&#xff0c;以其独特的图形化编程方式&#xff0c;激发了全球数百万孩子的创造力和逻辑思维能力。然而&#xff0c;随着孩子们创意的不断扩展&#…

centos7解决病毒入侵 getty

首先使用top命令查看 找到文件地址 查看是否有自启动服务 关闭、停止、删除 tmp 病毒文件删除 清除标记 [roothost-192-168-0-66 bin]# chattr -ia /tmp/newsvc.sh [roothost-192-168-0-66 bin]# chattr -ia /tmp/redis2 [roothost-192-168-0-66 bin]# chattr -ia /tmp/svc* [r…

C++开发IDE用VisualStudio好还是QtCreator好?

在熟练使用了VisualStudio和QtCreator之后,我依然认为QtCreator作为C++项目开发IDE的便捷性真的相当杰出。 当然了,VisualStudio和QtCreator本身就不是一个量级,VS越做越大,庞大的插件库也使得他能够支持从嵌入式到手机端,从web到脚本,甚至游戏,仿真等等各个领域的开发…

Leetcode 1047-删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 题解 题目链接 //先进后出&a…

网络-VPN

VPN&#xff08;Virtual Private Network&#xff0c;虚拟专用网络&#xff09;是一种网络技术&#xff0c;用于在公共网络&#xff08;如互联网&#xff09;上建立一个安全的、加密的连接通道&#xff0c;以保护数据传输的安全性和隐私。通过使用 VPN&#xff0c;用户可以在不…

线程面试题

1.JDK自带的线程池有哪些&#xff1f; 2.线程池中核心线程数与最大线程数与缓冲任务队列的关系&#xff1f; 先使用核心线程执行任务。 当核心线程不足时&#xff0c;新任务入队列等待。 当队列满且线程数未达最大值时&#xff0c;增加非核心线程执行任务。 当队列满且线程…

xss-labs通关攻略 11-15关

第十一关&#xff1a;less-11 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第十二关&#xff1a;less-12 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;修改User A…

熟悉Labview工具用

目录复制 目录 0.0&#xff1a;快捷键0.1&#xff1a;全局非图标显示0.2&#xff1a;小技巧&#xff1a;图片导入为程序1.2&#xff1a;事件结构1.2.0&#xff1a;超时分支&#xff1a;当事件结构框左上角设置为1时&#xff0c;单位毫秒&#xff0c;即理解为1ms内没有其他的事件…

ReadAgent,一款具有要点记忆的人工智能阅读代理

人工智能咨询培训老师叶梓 转载标明出处 现有的大模型&#xff08;LLMs&#xff09;在处理长文本时受限于固定的最大上下文长度&#xff0c;并且当输入文本越来越长时&#xff0c;性能往往会下降&#xff0c;即使在没有超出明确上下文窗口的情况下&#xff0c;LLMs 的性能也会随…

Python爬虫技术终端协议分析与抓包应用

内容导读 分析PC客户端抓包 分析App客户端抓包 一、分析PC客户端抓包 以爬取某音乐PC客户端为例&#xff0c;实现网页内容爬取与分析。 任务描述&#xff1a; 终端协议是网络上设备之间通信规则的集合&#xff0c;通过终端协议可以获取PC客户端和App客户端数据。常用的PC…

Node.js中的pipe方法:深入解析与应用指南

在Node.js中&#xff0c;pipe方法是处理流&#xff08;Stream&#xff09;数据的一种非常高效的方式。它允许你将一个可读流&#xff08;Readable Stream&#xff09;的数据直接传输到一个可写流&#xff08;Writable Stream&#xff09;中&#xff0c;而无需手动编写读取和写入…