记得以后基类(父类) 的析构函数最好是声明为 虚函数 即: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. 构造函数和析构函数能否声明为虚函数?

    构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数. 不建议在构造函数和析构函数里面调用虚函数. 构造函数不能声明为虚函数的原因是: 解释一:所谓虚函数就是多态情况下只执行 ...

  2. 构造函数不可以声明为虚函数,析构函数可以声明为虚函数

    构造函数不能声明为虚函数,而析构函数可以声明为虚函数,在有的情景下析构函数必须声明为虚函数.  不建议在构造函数和析构函数里调用虚函数. 构造函数不能声明为虚函数的原因? 构造一个对象时,必须知道对象 ...

  3. 析构函数为什么写成虚函数?

    由于类的多态性,基类指针可以指向派生类的对象.如果删除该基类的指针,就会调用该指针指向的派生类的析构函数,而派生类的析构函数又会自动调用基类的析构函数,这样整个派生类的对象被完全释放.· 如果析构函数 ...

  4. 构造函数为什么一般不定义为虚函数?而析构函数一般写成虚函数的原因 ?

    1.构造函数不能声明为虚函数 1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的.而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等 ...

  5. C++ 哪些函数不能声明成虚函数

    在C++,有五种函数不能被声明成虚函数,分别是:非成员函数.构造函数.静态成员函数.内联成员函数.友元函数这五种,下面分别解释为什么这五种函数不能被声明成虚函数. 1. 非成员函数 非成员函数只能被重 ...

  6. java 虚基类_重拾C++之虚函数和虚基类以及抽象类

    一.引言 好久没接触过C++了,今天突然要用一点感觉号蛋疼,用惯了python感觉C++一点都不会了. 声明了一个类的对象居然用这种方法,脑子绝对是被驴(python)踢了 class A{ ... ...

  7. 为什么析构函数可以能声明为虚函数,构造函数不可以

    转自:http://blog.csdn.NET/chen825919148/article/details/8020550 构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函 ...

  8. C++中不能声明为虚函数的有哪些函数

    常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能被overload,不能被o ...

  9. 为什么基类的析构函数是虚函数?

    1.第一段代码 #include<iostream> using namespace std; class ClxBase{ public:ClxBase() {};~ClxBase() ...

最新文章

  1. 静态方法、类方法、属性方法
  2. 2.8 GloVe词向量-深度学习第五课《序列模型》-Stanford吴恩达教授
  3. Windows下编译axel 2.6 / 2.11(下载神器)
  4. 【MySQL】查看 mysql 数据库最后修改时间、创建时间、表大小
  5. 友浩达优选上新,原生态农产品,买得安心,吃得放心
  6. 武汉火神山医院正式交付,华为提供多项技术支持
  7. js/d3.min.js_在5分钟内学习D3.js
  8. (20)Xilinx FPGA型号(FPGA不积跬步101)
  9. 关于生命周期函数dealloc的使用小结
  10. GIT 添加多个git账号
  11. BZOJ4305 数列的GCD
  12. python求解next数组实现KMP算法
  13. vigenere加密与解密算法
  14. MySQL函数、存储过程
  15. android rmvb格式下载,rmvb格式转换器安卓版
  16. 装了V2.6.41,C4D启动卡死在初始化插件页面,装了RS后C4D无法启动,C4D用什么版本的RS?
  17. 服务器出现502错误,怎么办。
  18. 编制现金流量表3个步骤!
  19. redis使用及Spring Session+Redis实现Session共享
  20. win10、win7“以太网”将WiFi名称改成网络名称

热门文章

  1. Swift互用性:采用Cocoa设计模式(Swift 2.0版)-b
  2. linux下修改网卡接口名称
  3. Centos 编译安装sphinx-0.9.9全文检索
  4. py_innodb_page_info.py 脚本下载
  5. dp、sp和px的区别
  6. 在Ubuntu上安装Odoo 11(企业版)
  7. Angular 选项卡
  8. vuex入门,详细的讲解
  9. 定制键盘输入处理(1503)
  10. gradlew 的https代理设定