#include <cstdio>class Base
{public:~Base() { ::printf("base\n"); }
};class Derived : public Base
{public:~Derived() { ::printf("derived\n"); }
};
Base *ptr = new Derived;
delete ptr;

由于父类析构函数不是虚函数,因此编译器只能找到父类析构函数,而无法通过续表找到子类析构函数,因此上例会造成内存泄漏,子类中的数据成员没法得到释放。最重要的是这种行为并不会被编译器察觉
因此effective c++建议,一个类一旦确认要被继承就应该在其析构函数前加上关键字virtual
因此得到下面的写法:

#include <cstdio>class Base
{public:virtual ~Base() { ::printf("base\n"); }
};class Derived : public Base
{public:~Derived() { ::printf("derived\n"); }
};

如此,就不会出现多态下的内存泄漏问题。

但是!如果父类设计者忘记加关键字virtual,或者由于业务的需要,当前类必须被子类实现某些功能( interface-implement ),岂不是就会再次造成泄漏?
因此,作为子类的设计者,有义务提醒父类设计者,缺少关键字virtual,从而避免内存泄漏

C++11 新特性中的关键字override,编译器会检查基类中的虚函数和派生类中带有override的虚函数有没有相同的函数签名,一旦不匹配便会报错
因此子类设计者可以在其析构函数后增加关键字override,一旦父类缺少关键字virtual就会被编译器发现并报错

#include <cstdio>class Base
{public:virtual ~Base() { ::printf("base\n"); }
};class Derived : public Base
{public:~Derived() override { ::printf("derived\n"); }
};

C++ override 虚析构函数 使用技巧相关推荐

  1. vs 不能自动 析构函数_深入理解C++虚函数的override、overload与hide以及虚析构函数...

    今天主要讲的是虚函数的override与overload的区别.首先我们来看一段代码: 示例代码 #include <stdio.h> #include <string> #i ...

  2. C++学习12:C++多态、虚函数、虚析构函数、纯虚函数、抽象类

    一 多态概述 C++中的多态分为静态多态和动态多态.静态多态是函数重载,在编译阶段就能确定调用哪个函数.动态多态是由继承产生的,指同一个属性或行为在基类及其各派生类中具有不同的语义,不同的对象根据所接 ...

  3. unique函数_C++智能指针2:(虚?)析构函数(标准与实现的差异)

    只要是有良心的 C++ 教材,总是会苦心孤诣地告诫初学者,在继承关系中,应该把父类的析构函数定义成虚函数.这已然成为一条铁律,如果违背,不仅有内存泄漏的风险,在多继承情况下甚至会出现未定义行为.因此, ...

  4. 【c++】28.虚析构函数、纯虚函数

    1.虚函数:在类的成员函数前面加virtual关键字的函数: 一般把虚函数定义在public区,方便在主函数中调用 如果一个类有一个虚函数,则该类就有一个虚函数列表,所有该类的对象都共享这个虚函数表: ...

  5. 没有varselect这个函数_C++的虚函数,虚析构函数,纯虚函数

    修改日期:2020/9/6 C++的虚函数 C++的虚函数的特点就是动态绑定,它的意思是动态绑定,在运行的时候,通过引用和指针,可以用基类的类,引用继承该c++类的派生类,虽然指针是基类,但实际上运行 ...

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

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

  7. C++继承中构造函数、析构函数调用顺序及虚析构函数

    首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...

  8. C++对象模型7——类的成员函数、反汇编虚析构函数、RTTI、多态的开销

    一.类成员函数 class test { public:void myfunc(){}virtual void vfunc() {}static void sfunc() {} };void myfu ...

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

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

最新文章

  1. 剑指offer:面试题10- II. 青蛙跳台阶问题
  2. c语言解决函数变参数问题 va_list
  3. 从ETL工具到企业云数据管理,在大数据风口的Informatica完成蜕变
  4. C++ 函数参数入栈方式与调用约定
  5. Python装饰器之一
  6. 打开你的脑洞:NER如何进行数据增强 ?
  7. can总线配置读入是什么意思_CAN总线(一)
  8. IDEA + Spring boot devtools 热部署 与 多实例启动
  9. 在家自学html,怎样在家自学英语口语
  10. 描述十二个异性追求者的拓展
  11. 解决zabbix微信报警web界面显示已送达,但微信收不到的问题
  12. 计算机桌面图标设置密码,教你怎么设置电脑开机密码
  13. 最适合0基础入门的5种编程语言
  14. 【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)
  15. 地推脑30秒速装华为移动应用引擎,电脑也能玩安卓
  16. 输出《易经》六十四卦的卦象符号
  17. 陈大佬:机器学习科研这十年
  18. 全新UI简洁H5商城网站源码/带易支付接口
  19. C++项目实践(银行管理系统)
  20. 用origin画统计图

热门文章

  1. groovy安装配置及其开启indy、@CompileStatic
  2. numpy的astype函数
  3. java多线程学习之【Exchanger】
  4. Java-毕业设计-企业财务报销系统-SpringBoot-MyBatis-VUE
  5. 使用springboot整合EasyExcel对excel类型的文件进行读写操作
  6. 如何快速提升网站权重?网站权重高有什么用?
  7. 车牌识别--铆钉的去除
  8. 代码界的那些神级“教父”,看你认识几个?
  9. 有限内存BFGS以及非精确牛顿法
  10. 卡莱特递交注册:年营收5.8亿 周锦志控制63%股权