C++虚析构和纯虚析构解决delete堆区父类指针无法调用子类的构造函数

#include<iostream>
#include<string>using namespace std;//虚析构和纯虚析构
class Animal
{
public:Animal(){cout<<"执行Animal的构造函数"<<endl;}~Animal(){cout<<"执行Animal的析构函数"<<endl;}virtual void speak()=0;
};
class Cat:public Animal
{
public:string* m_Name;Cat(string name){cout<<"执行Cat的构造函数"<<endl;// new string(name)是在堆区创建一个内容为name的字符层,并返回该字符层的指针。m_Name = new string(name);}virtual void speak(){cout<<*m_Name<<"小猫在说话"<<endl;}~Cat(){if(m_Name!=NULL){cout<<"执行Cat的析构函数"<<endl;delete m_Name;m_Name = NULL;}}
};
void test01()
{Animal* animal = new Cat("Tom");animal->speak();delete animal;
}int main()
{test01();
}

在这里插入图片描述

发现程序没有调用子类Cat的析构函数。
因为我们用父类的指针指向子类Cat,当delete animal;时,父类调用自己的析构函数并不会执行子类的析构函数。
导致子类如果有堆区属性,会出现内存泄漏。
解决方法把父类的析构函数改为虚西狗。

虚析构

 virtual ~Animal(){cout<<"执行Animal的析构函数"<<endl;}

在这里插入图片描述

纯虚析构

virtual ~Animal() = 0;

运行之后报错,因为纯虚析构只是声明,没有实现。

#include<iostream>
#include<string>using namespace std;//虚析构和纯虚析构
class Animal
{
public:Animal(){cout<<"执行Animal的构造函数"<<endl;}virtual ~Animal() = 0;virtual void speak()=0;
};class Cat:public Animal
{
public:string* m_Name;Cat(string name){cout<<"执行Cat的构造函数"<<endl;// new string(name)是在堆区创建一个内容为name的字符层,并返回该字符层的指针。m_Name = new string(name);}virtual void speak(){cout<<*m_Name<<"小猫在说话"<<endl;}~Cat(){if(m_Name!=NULL){cout<<"执行Cat的析构函数"<<endl;delete m_Name;m_Name = NULL;}}};void test01()
{Animal* animal = new Cat("Tom");animal->speak();delete animal;
}Animal::~Animal()
{cout<<"执行Animal的析构函数"<<endl;
}int main()
{test01();
}

在这里插入图片描述

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

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

相关文章

【LeetCode二叉树进阶题目】606,102,107

二叉树进阶题目 606. 根据二叉树创建字符串解题思路及实现 102. 二叉树的层序遍历解题思路及实现 107. 二叉树的层序遍历 II解题思路及实现 606. 根据二叉树创建字符串 描述 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号…

upload-labs关卡12(基于白名单的%00截断绕过)通关思路

文章目录 前言一、靶场需要了解的前置知识1、%00截断2、0x00截断3、00截断的使用条件1、php版本小于5.3.292、magic_quotes_gpc Off 二、靶场第十二关通关思路1、看源代码2、bp抓包%00截断3、验证文件是否上传成功 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&…

千梦网创:创业一定要学会打造自己的榜样圈

一、状态 最近一直在学习刘克亚老师的书籍和课程。 克亚老师“国际自由族”的概念实际上就是实现“工作自由”。 财务自由只是一个奋斗目标&#xff0c;但“工作自由”是一种可实现的工作状态。 这种工作状态有一个特征就是全力打造一套能够无限趋近于“全自动”的赚钱系统。…

【喜报】云贝学员顺利通过OceanBase 数据库上机实验,OBCP证书到手了!!!

恭喜LIU同学历经2月&#xff0c;经过郭老师考前辅导顺利拿下OBCP证书&#xff01; 考试形式 OBCP V3.0考试分为笔试考试和实验考试两部分。 笔试考试&#xff1a; 考试形式:线下考点考试(官网预约) 考试时长: 90分钟 题目一共66道题&#xff08;从题库中随机抽取&#xff…

Git 教程

目录 Git 与 SVN 区别 Git 快速入门 学习目录 git简明指南 Git 安装配置 Git 工作流程、工作区、暂存区和版本库 Git 创建仓库 Git 基本操作 Git 分支管理 Git 查看提交历史 Git 标签 Git 远程仓库(Github) Git 服务器搭建 Git 是一个开源的分布式版本控…

【java】想要限制每次查询的结果集不能超过10000行,该如何实现?

文章目录 前言 前言 对于一些Saas化软件&#xff0c;当某个租户在执行查询SQL时&#xff0c;如果查询条件出现了BUG&#xff0c;导致去查了所有租户的数据&#xff0c;这种情况是非常严重的&#xff0c;此时就需要在架构层面做限制&#xff0c;禁止一些特殊SQL的执行&#xff…

C++电脑组装项目(涉及知识点:多态)

需求&#xff1a; #include <iostream> #include "Computer.h" #include "AbstractCpu.h" #include "AbstractMemory.h" #include "AbstractVideoCard.h" #include "IntelCpu.h" #include "IntelMemory.h" …

论文笔记:Localizing Cell Towers fromCrowdsourced Measurements

2015 1 Intro 1.1 motivation opensignal.com 、cellmapper.net 和 opencellid.org 都是提供天线&#xff08;antenna&#xff09;位置的网站 他们提供的天线位置相当准确&#xff0c;但至少在大多数情况下不完全正确这个目标难以实现的原因是蜂窝网络供应商没有义务提供有…

02 请求默认值

一、HTTP请求默认值&#xff1a;是用来管理所有请求共有的协议、网址、端口等信息的&#xff1b;通常情况下&#xff0c;一批量的接口测试&#xff0c;访问的是同一个站点&#xff0c;那么以上信息基本都是相同的&#xff0c;就不需要在每个请求中重复编写&#xff1b; 每个请…

【EI会议征稿】第九届能源科学与化学工程国际学术研讨会 (ISESCE 2024)

第九届能源科学与化学工程国际学术研讨会 &#xff08;ISESCE 2024&#xff09; 2024 9th International Symposium on Energy Science and Chemical Engineering 第九届能源科学与化学工程国际学术研讨会&#xff08;ISESCE 2024&#xff09;定于2024年3月22-24日在中国南京…

世微 dc-dc降压恒流 LED汽车大灯 单灯 14V5A 68W车灯驱动方案 AP5191

产品描述 AP5191是一款PWM工作模式,高效率、外围简单、外置功率MOS管&#xff0c;适用于4.5-150V输入的高精度降压LED恒流驱动芯片。输出最大功率150W&#xff0c;最大电流6A。AP5191可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5191 工作频率可以…

银升玻璃能源数据采集监控方案

项目背景 监控配电房电表的电压、电流、功率、总电能等数据。 监控配电房变压器的电流、温度数据&#xff0c;在数据超出额定指标时&#xff0c;进行报警推送。 现场调研情况 经过现场调研&#xff0c;共有3个变压器房&#xff0c;有不同类型的电表。具体如下表&#xff1a…