C++多态之虚析构与纯虚析构
一、虚析构与纯虚析构的共同点:
- 都是释放子类的堆区资源。
- 都需要具体实现。
二、虚析构与纯虚析构的不同点:
- 使用纯虚析构函数的父类属于抽象类,不能实例化具体对象。代码示例如下:
#include <iostream>// 父类 class Base {public:// 纯虚析构函数virtual ~Base() = 0;};// 纯虚析构函数的实现,此处必须实现,因为是析构函数,可能会释放父类的堆区资源,否则代码会报错 Base::~Base() {std::cout << "父类的纯虚析构函数调用" << std::endl; }class Son : public Base {public:// 子类析构函数的实现virtual ~Son(){std::cout << "子类的析构函数调用" << std::endl;} };int main() {// 实例化失败,此处代码会报错,因为父类有纯虚析构函数,是抽象类// Base * base = new Base;// 实例化成功,因为子类不是抽象类Base * base = new Son;system("pause");return 0; }
- 使用虚析构函数的父类不属于抽象类,可以实例化具体对象。代码实例如下:
#include <iostream>class Father {public:// 父类的虚析构函数virtual ~Father(){std::cout << "父类的虚析构函数调用" << std::endl;}};int main() {// 此时父类实例化成功,因为父类不是抽象类,代码不会报错Father * father = new Father;system("pause");return 0; }
三、虚析构与纯虚析构的作用
解决父类指针或父类引用无法释放子类资源导致的内存泄露问题 。
现在可以来做个对比,首先写一个无虚析构或无纯虚析构的父类代码案例,看看最后的打印信息
无虚析构或无纯虚析构的父类代码案例:
#include <iostream>
using namespace std;class Father
{public:// 父类的析构函数~Father(){std::cout << "父类的析构函数调用" << std::endl;}
};class Son : public Father
{public:// 子类的析构函数~Son(){std::cout << "子类的析构函数调用" << std::endl;}
};int main()
{Father * father = new Son;delete father;system("pause");return 0;
}
运行结果截图如下,可见未调用子类的析构函数,如果此时的子类申请了堆区资源,必将造成内存泄露问题:
有虚析构或纯虚析构的父类代码案例
#include <iostream>class Father
{public:// 父类的构造函数Father(){std::cout << "父类的构造函数调用" << std::endl;}// 父类的虚析构函数virtual ~Father(){std::cout << "父类的虚析构函数调用" << std::endl;}};class Son : public Father
{public:// 子类的构造函数Son(std::string name){std::cout << "子类构造函数的调用" << std::endl;// 子类申请堆区资源m_Name = new std::string(name);}~Son(){std::cout << "子类析构函数的调用" << std::endl;// 析构子类的堆区资源if (m_Name != NULL){delete m_Name;m_Name = NULL;}}// 此处为字符串指针变量,是为了申请堆区资源做准备std::string * m_Name;
};int main()
{Father * father = new Son("Jack");delete father;system("pause");return 0;
}
运行结果截图如下,在此段代码中,父类使用了虚析构函数,子类申请了堆区资源,在释放父类资源的同时也释放了子类资源。
如果喜欢此文章,可以点赞哦,我会无偿分享所有源码与自己的C++成长之路 !
C++多态之虚析构与纯虚析构相关推荐
- c++中多态---3(虚析构和纯虚析构,向上类型转化和向下类型转化)
虚析构和纯虚析构 虚析构 virtual ~类名(){} 类内声明,类内实现 解决问题:通过父类指针指向子类对象释放时候不干净的问题 纯虚析构 写法 virtual ~类名(){}=0; 类内声明 类 ...
- c/c++入门教程 - 2.4.7 多态、函数地址晚绑定(重写,虚函数,纯虚函数,抽象类,虚析构,纯虚析构)
目录 4.7 多态 4.7.1 多态的基本概念(超级重要) 4.7.2 多态的原理刨析(超级重要) 4.7.2 多态案例一:计算器类 4.7.3 纯虚函数和抽象类 4.7.4 多态案例二 - 制作饮品 ...
- C++类与对象笔记十四:多态六:虚析构和纯虚析构
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码. 即:父类指针无法调用子类实例对象内的析构函数.造成堆区内存泄漏. 解决方案:将父类中的析构函数改为虚析构或者纯虚析 ...
- C++多态之析构和纯虚析构分析与示例
虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放 ...
- c++ 多态 学习总结3 虚析构和纯虚析构
为什么要用虚析构和纯虚析构: 在使用多态时,如果子类中有属性开辟到堆区,那么我们在释放(或delete)父类的指针时无法调用子类的析构代码,释放子类在堆区的内存,会导致内存泄漏的问题. eg: #in ...
- C++_类和对象_C++多态_虚析构和纯虚析构函数---C++语言工作笔记074
然后我们再来看,虚析构和纯虚析构函数的用法,上面有大体的介绍了. 但是我们还是用一个例子来说明一下更好. 首先,我们去创建一个Animal类,类中我们去写上一个spreak这个,纯虚函数,然后,让我们 ...
- C++虚析构和纯虚析构
C++虚析构和纯虚析构 虚析构和纯虚析构 示例 总结 虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者 ...
- C++虚函数、纯虚函数、虚析构、纯虚析构、动态绑定和抽象类详解。
目录 1.虚函数的概念 2.虚函数的定义 3.虚函数的作用 4.用虚函数实现多态的方法 5.动态绑定和静态绑定 6.纯虚函数和抽象类 7.虚析构和纯虚析构 1.虚函数的概念 在C++程序中我们经常可以 ...
- C++中的各种“虚“-- 虚函数、纯虚函数、虚继承、虚基类、虚析构、纯虚析构、抽象类讲解
C++中的各种"虚" 1. 菱形继承 1.1 虚继承 && 虚基类 1.2 虚基类指针(vbptr)&& 虚基类表(vbtable) 2. 多态 2 ...
最新文章
- Codeforces Round #550 (Div. 3)E. Median String
- 【 FPGA 】FIR 滤波器之半带插值器(Half-band Interpolator)
- 第46讲:遇到动态页面怎么办?详解渲染页面爬取
- 编程基本功:有了范例代码,怎么办?
- linux开发板 杭州迈冲,杭州迈冲科技MC9G20-DK评估开发板
- 产品原型工具 AXURE9 Mac汉化
- 用计算机如何扫描文件,打印机扫描文件到电脑方法教程
- OKR目标管理专题及模板大全
- 3A游戏大作都在用什么宝藏技术?
- 阿里达摩院做AI这两年
- 2021年西式面点师(中级)考试题库及西式面点师(中级)考试试题
- idea中javaweb的jsp页面图片加载不出来的解决办法
- Spark技能成长,CSDN就go了!
- [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏
- 怎么把ppt文字大小设置一致_学会这个方法,轻松制作海报级别的霓虹灯PPT!
- 基线提升至96.45%:2022 司法杯犯罪事实实体识别+数据蒸馏+主动学习
- 中国科学技术大学计算机科学夏令营,中国科学技术大学计算机科学2019年推免夏令营通知...
- 计算完全最短路径的Floyd算法
- A标签新窗口打开怎么设置
- 某校2019专硕编程题-完全数