C++ override 虚析构函数 使用技巧
#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 虚析构函数 使用技巧相关推荐
- vs 不能自动 析构函数_深入理解C++虚函数的override、overload与hide以及虚析构函数...
今天主要讲的是虚函数的override与overload的区别.首先我们来看一段代码: 示例代码 #include <stdio.h> #include <string> #i ...
- C++学习12:C++多态、虚函数、虚析构函数、纯虚函数、抽象类
一 多态概述 C++中的多态分为静态多态和动态多态.静态多态是函数重载,在编译阶段就能确定调用哪个函数.动态多态是由继承产生的,指同一个属性或行为在基类及其各派生类中具有不同的语义,不同的对象根据所接 ...
- unique函数_C++智能指针2:(虚?)析构函数(标准与实现的差异)
只要是有良心的 C++ 教材,总是会苦心孤诣地告诫初学者,在继承关系中,应该把父类的析构函数定义成虚函数.这已然成为一条铁律,如果违背,不仅有内存泄漏的风险,在多继承情况下甚至会出现未定义行为.因此, ...
- 【c++】28.虚析构函数、纯虚函数
1.虚函数:在类的成员函数前面加virtual关键字的函数: 一般把虚函数定义在public区,方便在主函数中调用 如果一个类有一个虚函数,则该类就有一个虚函数列表,所有该类的对象都共享这个虚函数表: ...
- 没有varselect这个函数_C++的虚函数,虚析构函数,纯虚函数
修改日期:2020/9/6 C++的虚函数 C++的虚函数的特点就是动态绑定,它的意思是动态绑定,在运行的时候,通过引用和指针,可以用基类的类,引用继承该c++类的派生类,虽然指针是基类,但实际上运行 ...
- C++中虚析构函数和纯虚函数的作用
一. 虚析构函数 为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数.因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数. class Base ...
- C++继承中构造函数、析构函数调用顺序及虚析构函数
首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...
- C++对象模型7——类的成员函数、反汇编虚析构函数、RTTI、多态的开销
一.类成员函数 class test { public:void myfunc(){}virtual void vfunc() {}static void sfunc() {} };void myfu ...
- C++编程进阶2(编译器在类内默认生成的函数讨论以及纯虚析构函数)
三.编译器默认提供的类内函数讨论 1.当写下一个空类时,编译器会在必要的时候默认提供四个函数:构造.拷贝构造.operator=和析构函数,而且都是public的 class Empty{ }; 上述 ...
最新文章
- 剑指offer:面试题10- II. 青蛙跳台阶问题
- c语言解决函数变参数问题 va_list
- 从ETL工具到企业云数据管理,在大数据风口的Informatica完成蜕变
- C++ 函数参数入栈方式与调用约定
- Python装饰器之一
- 打开你的脑洞:NER如何进行数据增强 ?
- can总线配置读入是什么意思_CAN总线(一)
- IDEA + Spring boot devtools 热部署 与 多实例启动
- 在家自学html,怎样在家自学英语口语
- 描述十二个异性追求者的拓展
- 解决zabbix微信报警web界面显示已送达,但微信收不到的问题
- 计算机桌面图标设置密码,教你怎么设置电脑开机密码
- 最适合0基础入门的5种编程语言
- 【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)
- 地推脑30秒速装华为移动应用引擎,电脑也能玩安卓
- 输出《易经》六十四卦的卦象符号
- 陈大佬:机器学习科研这十年
- 全新UI简洁H5商城网站源码/带易支付接口
- C++项目实践(银行管理系统)
- 用origin画统计图