偷偷拿来记录一下萌新的cs路——day 42

用多态编写以下代码:

#include<iostream>
#include<string>
using namespace std;class Animal {
public:Animal() {cout<<"Animal 构造函数调用"<<endl;}virtual void speak() = 0;~Animal() {cout << "Animal 析构函数调用" << endl;}
};class Cat : public Animal {
public:Cat(string name) {cout << "Cat 构造函数调用" << endl;m_Name = new string(name);  // 数据创建在堆区}virtual void speak() {cout << *m_Name << ": Miao " << endl;}~Cat() {if (m_Name != NULL) {cout << "Cat 析构函数调用" << endl;delete m_Name;m_Name = NULL;}}string * m_Name;
};void test01() {Animal* animal = new Cat("Tom");animal->speak();delete animal;
}int main() {test01();return 0;
}

运行结果:

由于Cat 析构函数未被调用,可知堆区数据未被及时删除,存在泄露。其原因是父类指针在析构时不会调用子类的析构函数,所以子类若有堆区数据会内存泄露。

解决方法:将父类析构函数改为虚函数

virtual ~Animal() {cout << "Animal 析构函数调用" << endl;}

运行结果:

若改为纯虚析构函数,会报错“无法解析的外部命令”,原因为父类也有需要释放的堆区数据,而析构函数未定义。

virtual ~Animal() = 0;

解决方法:在父类外定义纯虚析构函数。

class Animal {
public:Animal() {cout<<"Animal 构造函数调用"<<endl;}virtual void speak() = 0;// 虚析构解决父类指针释放子类对象不干净问题/*virtual ~Animal() {cout << "Animal 析构函数调用" << endl;}*/virtual ~Animal() = 0;
};Animal:: ~Animal() {cout << "Animal 纯虚析构函数调用" << endl;
}

运行结果:

注意纯虚析构函数存在时,类同样变为抽象类,无法被实例化。

若子类不存在需要释放的堆区数据,可以不使用虚析构or纯虚析构函数。

有误之处请大佬指正,感谢!

C++ (纯)虚析构函数相关推荐

  1. C++编程进阶2(编译器在类内默认生成的函数讨论以及纯虚析构函数)

    三.编译器默认提供的类内函数讨论 1.当写下一个空类时,编译器会在必要的时候默认提供四个函数:构造.拷贝构造.operator=和析构函数,而且都是public的 class Empty{ }; 上述 ...

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

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

  3. c++析构函数、虚析构函数、纯虚析构函数详解

    我们知道对象在结束其生命周期之前,都会调用析构函数以完成必要的清理工作:派生类调用的析构函数顺序是"先子类,后基类": 这篇文章用于总结当析构函数是普通析构函数.虚析构函数.纯虚析 ...

  4. 析构函数、虚析构函数、纯虚析构函数

    我们知道对象在结束其生命周期之前,都会调用析构函数以完成必要的清理工作:派生类调用的析构函数顺序是"先子类,后基类": 这篇文章用于总结当析构函数是普通析构函数.虚析构函数.纯虚析 ...

  5. 6.4虚析构函数和纯虚析构函数

    虚析构函数和纯虚析构函数 如果有一定基础的伙伴来看这篇文章之前应该都知道虚析构函数的用途,虚析构函数就是防止有有没有释放干净的内存,防止内存泄漏. 没学过也没有关系我们通过了解原理的过程来学习这个虚析 ...

  6. C++虚析构函数和纯虚析构函数

    1.为什么要使用虚析构函数 我们知道析构函数是在对象生命周期结束时自动被调用,用来做一些清理工作(如释放句柄,释放堆内存等),防止出现内存泄漏. 那怎么还有虚析构函数呢? 使用虚析构函数的类一般是要作 ...

  7. C++中虚析构函数和纯虚析构函数

    可以看一下之前的博客: 1.C++纯虚函数和抽象类 2.C++继承中的构造和析构 3.C++之基类的析构函数要声明成虚函数 一. 虚析构函数 为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶 ...

  8. 构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。

    构造函数不可以是虚函数:析构函数可以是虚函数,也可以是纯虚函数. 一:构造函数不能声明为虚函数的原因 1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的. 而在构造 ...

  9. C++中虚析构函数和纯虚函数的作用

    一. 虚析构函数 为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数.因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数. class Base ...

  10. 析构函数可以为纯虚函数吗?纯虚函数可以有函数体吗?纯虚函数需要函数体吗?

    先回答标题中中的几个问题: 析构函数可以为纯虚函数吗? yes. 纯虚函数可以有函数体吗? yes. 纯虚函数需要函数体吗? 一般来讲,如果析构函数是纯虚函数,那么析构函数必须要有函数体,如果是其它函 ...

最新文章

  1. oracle11g迁移到12cpdb,12c跨平台完成PDB的备份迁移
  2. Android 布局属性 Android:layout_weight 总结
  3. Java内存溢出[转]和mysql配置文件简介[原创]
  4. wcf双工通讯遇到的问题
  5. RDB 和 AOF 持久化的原理是什么?我应该用哪一个?它们的优缺点? 1
  6. c/c++ 宏中#和##的用法
  7. php加skplayer,织梦dedecms怎么整合添加ckplayer播放器支持flv,mp4等播放功能
  8. 室内设计数据手册pdf_室内设计资料集pdf下载-室内设计资料集电子版pdf高清扫描版-东坡下载...
  9. 生物充电 - 利用树干生物电给无线传感器供电
  10. xtu1395 字符频度
  11. java生成和解析二维码实战——QRCode
  12. 《R语言数据分析》作业答案
  13. Android进阶知识树——Android消息队列
  14. 【视频播放器】potplayer调教教程
  15. Saber仿真教程视频 初级 中级 高级
  16. [Other]来做一个微信打印机吧 -- 微信打印的设计思路參考
  17. 美团5年来首次职级大调整,推扁平化,不升职也可加薪
  18. 西门子C65开发手札
  19. H3C 光模块产品及维护介绍
  20. windows动态添加lib的三种方法

热门文章

  1. php微信公众号调用扫一扫,微信公众号中h5页面扫一扫实现
  2. 法语助手,破解(实测可用)
  3. 经常读读可以让自己明心静起
  4. vue.js 时间戳转换日期格式
  5. IDEA快捷键定位编译错误
  6. 2011年大连徒步大会
  7. Collecting Bugs(解决bug)
  8. linux添加触摸屏,Linux_Linux系统下触摸屏的简单使用和配置方法, 如果你装的是 Ubuntu 发行 - phpStudy...
  9. oracle 进去rman,oracle数据库RMAN使用方法简介 | IT民工 or IT精英
  10. k折交叉验证 k-fold cross-validation