为什么基类的析构函数要声明成虚函数
记得以后基类(父类) 的析构函数最好是声明为 虚函数 即:virtual
开发中遇到了一个比较傻逼的bug,也证明了理论与实际之间的差距。
在基类中没有声明其析构函数为虚函数,导致delete 释放操作没有执行派生类 的析构函数,导致了内存泄漏,也严重影响了后续操作。
标题是我从网上找到的一篇文章的标题。
下面把文章记录下来!
--------------------------------------------
原因:
在公有继承中,基类的虚构函数如果不声明成为虚函数,那么销毁派生类时有可能造成资源泄漏
class Base{ public:
Base( ) { };
~Base( ) { };
};
class Derived :public Base{
public:
Derived( ) { };
~Derived( ){ };
};
void main( )
{
Base *p;
p = new Derived;
delete p;
}
这种情况会发生销毁不完全的情况,因为delete p调用的是声明类型(即基类)的析构函数,所以只能销毁基类对象而无法销毁派生类对象。
修改:
class Base{ public:
Base( ) { };
virtual ~Base( ) { };
};
class Derived :public Base{
public:
Derived( ) { };
~Derived( ){ };
};
void main( )
{
Base *p;
p = new Derived;
delete p;
}
当基类的析构函数声明为虚函数,那么派生类的析构函数也是虚函数,此时调用delete p时发生动态绑定,运行时会根据实际类型调用该对象的虚函数。
当然,并不是要把所有类的析构函数都写成虚函数。只有当一个类是基类(即希望被继承)的时候才需要声明成虚函数,因为虚函数的作用是实现多态,而多态是建立在继承的基础上。单一类不能把析构函数写成虚函数,因为会产生额外的开销,比如虚表的创建和虚指针的定义。
地址:http://blog.csdn.net/ljlstart/article/details/49310475
为什么基类的析构函数要声明成虚函数相关推荐
- 构造函数和析构函数能否声明为虚函数?
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数. 不建议在构造函数和析构函数里面调用虚函数. 构造函数不能声明为虚函数的原因是: 解释一:所谓虚函数就是多态情况下只执行 ...
- 构造函数不可以声明为虚函数,析构函数可以声明为虚函数
构造函数不能声明为虚函数,而析构函数可以声明为虚函数,在有的情景下析构函数必须声明为虚函数. 不建议在构造函数和析构函数里调用虚函数. 构造函数不能声明为虚函数的原因? 构造一个对象时,必须知道对象 ...
- 析构函数为什么写成虚函数?
由于类的多态性,基类指针可以指向派生类的对象.如果删除该基类的指针,就会调用该指针指向的派生类的析构函数,而派生类的析构函数又会自动调用基类的析构函数,这样整个派生类的对象被完全释放.· 如果析构函数 ...
- 构造函数为什么一般不定义为虚函数?而析构函数一般写成虚函数的原因 ?
1.构造函数不能声明为虚函数 1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的.而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等 ...
- C++ 哪些函数不能声明成虚函数
在C++,有五种函数不能被声明成虚函数,分别是:非成员函数.构造函数.静态成员函数.内联成员函数.友元函数这五种,下面分别解释为什么这五种函数不能被声明成虚函数. 1. 非成员函数 非成员函数只能被重 ...
- java 虚基类_重拾C++之虚函数和虚基类以及抽象类
一.引言 好久没接触过C++了,今天突然要用一点感觉号蛋疼,用惯了python感觉C++一点都不会了. 声明了一个类的对象居然用这种方法,脑子绝对是被驴(python)踢了 class A{ ... ...
- 为什么析构函数可以能声明为虚函数,构造函数不可以
转自:http://blog.csdn.NET/chen825919148/article/details/8020550 构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函 ...
- C++中不能声明为虚函数的有哪些函数
常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能被overload,不能被o ...
- 为什么基类的析构函数是虚函数?
1.第一段代码 #include<iostream> using namespace std; class ClxBase{ public:ClxBase() {};~ClxBase() ...
最新文章
- 静态方法、类方法、属性方法
- 2.8 GloVe词向量-深度学习第五课《序列模型》-Stanford吴恩达教授
- Windows下编译axel 2.6 / 2.11(下载神器)
- 【MySQL】查看 mysql 数据库最后修改时间、创建时间、表大小
- 友浩达优选上新,原生态农产品,买得安心,吃得放心
- 武汉火神山医院正式交付,华为提供多项技术支持
- js/d3.min.js_在5分钟内学习D3.js
- (20)Xilinx FPGA型号(FPGA不积跬步101)
- 关于生命周期函数dealloc的使用小结
- GIT 添加多个git账号
- BZOJ4305 数列的GCD
- python求解next数组实现KMP算法
- vigenere加密与解密算法
- MySQL函数、存储过程
- android rmvb格式下载,rmvb格式转换器安卓版
- 装了V2.6.41,C4D启动卡死在初始化插件页面,装了RS后C4D无法启动,C4D用什么版本的RS?
- 服务器出现502错误,怎么办。
- 编制现金流量表3个步骤!
- redis使用及Spring Session+Redis实现Session共享
- win10、win7“以太网”将WiFi名称改成网络名称