一、虚析构纯虚析构的共同点:

  1. 都是释放子类的堆区资源。
  2. 都需要具体实现。

二、虚析构与纯虚析构的不同点:

  1. 使用纯虚析构函数的父类属于抽象类,不能实例化具体对象。代码示例如下:

    #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;
    }
  2. 使用虚析构函数的父类不属于抽象类,可以实例化具体对象。代码实例如下:
    #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++多态之虚析构与纯虚析构相关推荐

  1. c++中多态---3(虚析构和纯虚析构,向上类型转化和向下类型转化)

    虚析构和纯虚析构 虚析构 virtual ~类名(){} 类内声明,类内实现 解决问题:通过父类指针指向子类对象释放时候不干净的问题 纯虚析构 写法 virtual ~类名(){}=0; 类内声明 类 ...

  2. c/c++入门教程 - 2.4.7 多态、函数地址晚绑定(重写,虚函数,纯虚函数,抽象类,虚析构,纯虚析构)

    目录 4.7 多态 4.7.1 多态的基本概念(超级重要) 4.7.2 多态的原理刨析(超级重要) 4.7.2 多态案例一:计算器类 4.7.3 纯虚函数和抽象类 4.7.4 多态案例二 - 制作饮品 ...

  3. C++类与对象笔记十四:多态六:虚析构和纯虚析构

    多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码. 即:父类指针无法调用子类实例对象内的析构函数.造成堆区内存泄漏. 解决方案:将父类中的析构函数改为虚析构或者纯虚析 ...

  4. C++多态之析构和纯虚析构分析与示例

    虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放 ...

  5. c++ 多态 学习总结3 虚析构和纯虚析构

    为什么要用虚析构和纯虚析构: 在使用多态时,如果子类中有属性开辟到堆区,那么我们在释放(或delete)父类的指针时无法调用子类的析构代码,释放子类在堆区的内存,会导致内存泄漏的问题. eg: #in ...

  6. C++_类和对象_C++多态_虚析构和纯虚析构函数---C++语言工作笔记074

    然后我们再来看,虚析构和纯虚析构函数的用法,上面有大体的介绍了. 但是我们还是用一个例子来说明一下更好. 首先,我们去创建一个Animal类,类中我们去写上一个spreak这个,纯虚函数,然后,让我们 ...

  7. C++虚析构和纯虚析构

    C++虚析构和纯虚析构 虚析构和纯虚析构 示例 总结 虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者 ...

  8. C++虚函数、纯虚函数、虚析构、纯虚析构、动态绑定和抽象类详解。

    目录 1.虚函数的概念 2.虚函数的定义 3.虚函数的作用 4.用虚函数实现多态的方法 5.动态绑定和静态绑定 6.纯虚函数和抽象类 7.虚析构和纯虚析构 1.虚函数的概念 在C++程序中我们经常可以 ...

  9. C++中的各种“虚“-- 虚函数、纯虚函数、虚继承、虚基类、虚析构、纯虚析构、抽象类讲解

    C++中的各种"虚" 1. 菱形继承 1.1 虚继承 && 虚基类 1.2 虚基类指针(vbptr)&& 虚基类表(vbtable) 2. 多态 2 ...

最新文章

  1. Codeforces Round #550 (Div. 3)E. Median String
  2. 【 FPGA 】FIR 滤波器之半带插值器(Half-band Interpolator)
  3. 第46讲:遇到动态页面怎么办?详解渲染页面爬取
  4. 编程基本功:有了范例代码,怎么办?
  5. linux开发板 杭州迈冲,杭州迈冲科技MC9G20-DK评估开发板
  6. 产品原型工具 AXURE9 Mac汉化
  7. 用计算机如何扫描文件,打印机扫描文件到电脑方法教程
  8. OKR目标管理专题及模板大全
  9. 3A游戏大作都在用什么宝藏技术?
  10. 阿里达摩院做AI这两年
  11. 2021年西式面点师(中级)考试题库及西式面点师(中级)考试试题
  12. idea中javaweb的jsp页面图片加载不出来的解决办法
  13. Spark技能成长,CSDN就go了!
  14. [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏
  15. 怎么把ppt文字大小设置一致_学会这个方法,轻松制作海报级别的霓虹灯PPT!
  16. 基线提升至96.45%:2022 司法杯犯罪事实实体识别+数据蒸馏+主动学习
  17. 中国科学技术大学计算机科学夏令营,中国科学技术大学计算机科学2019年推免夏令营通知...
  18. 计算完全最短路径的Floyd算法
  19. A标签新窗口打开怎么设置
  20. 某校2019专硕编程题-完全数

热门文章

  1. dell t320服务器 安装系统,dell t320服务器安装windows2008R2系统
  2. 响应国家号召 1+X 证书 Web 前端开发考试样题
  3. 马云说今年他要读100本书,你呢?
  4. 读书笔记——《马斯克》
  5. 关于互联网内容服务的公共协议(ICCP)[1]
  6. 诚意推荐几个腾讯、美团、阿里技术大佬的公号
  7. 服务器硬件信息查询,cpu、内存、硬盘
  8. 2019年世界机器人大会观感
  9. ​安装ns-3时候报错要求gcc版本高于7.00的问题解决​
  10. 【各种进之间的转换】