C++ 虚析构函数 20131010

在C++中的虚函数作用是实现基于继承机制的多态,但是我们好像忽略了一种情况,就是虚析构函数。在C++继承机制中,虽然构造函数是不可以使用虚函数声明,但是析构函数是可以声明为虚函数的。这样做的目的是为了当父类指针指向一个派生类的对象的时候,当删除该指针的时候,可以调用派生类的析构函数,释放资源。如果不是这样的话,那么在C++中的派生类的内存空间是不会被释放掉,会造成内存的浪费,最终导致内存溢出而是程序崩溃。

但是我们不能够随意的使用虚函数声明,因为会增加类的存储空间,当我们声明一个函数式虚函数的时候,编译器会生成一个虚表中的函数指针,这样的话,如果 没有必要使用虚函数而使用了虚函数的话,会造成资源的浪费。

一个例子:

#include <iostream>

using namespace std;

class Base{

public:

Base(){

cout << "Base::constructor" << endl;

}

virtual ~Base(){

cout << "Base::~Base()" << endl;

}

};

class Derived:public Base{

public:

Derived(){

cout << "Derive::Constructor" << endl;

}

~Derived(){

cout << "Derived::~Derived()" << endl;

}

};

int main()

{

Base * pBase = new Derived();

delete pBase;

return 0;

}

这样才会争取的调去析构函数,而且是调用两个析构函数。

Base::constructor

Derive::Constructor

Derived::~Derived()

Base::~Base()

但是如果不适用虚函数的话,那么就会造成值会调用父类的析构函数,就结束了。

最新文章

  1. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十二)水情雨情模块
  2. ajax的使用:(ajaxReturn[ajax的返回方法]),(eval返回字符串);分页;第三方类(page.class.php)如何载入;自动加载函数库(functions);session如何防止跳过登录访问(构造函数说明)
  3. DP~青蛙过河(hrbust1186)
  4. poj 2337 欧拉回路输出最小字典序路径 ***
  5. SolrCloud zookeeper节点信息
  6. 161209、简要分析ZooKeeper基本原理及安装部署
  7. [codility]Grocery-store
  8. 复位应答ATR的基本结构和数据元
  9. AngularJS+requireJS项目的目录结构设想
  10. android activity中监听View测量完成的4种方式
  11. 认证客户端的链接与socketserver实现并发
  12. LGOJ P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
  13. 刘志梅201771010115.《面向对象程序设计(java)》第十五周学习总结
  14. pandas列操作集锦
  15. [2017-7-28]Android Learning Day6
  16. luogu P3980 [NOI2008]志愿者招募
  17. SQLServer之视图篇
  18. vultr vps(ubuntu)忘记密码
  19. test20181015 B君的第二题
  20. 使用python来搞定redis的订阅功能

热门文章

  1. 后缀自动机模板 SAM
  2. centos7 最小化安装后的配置优化
  3. (转载)sql注入实战 mysql篇
  4. 【转】C#操作xml
  5. EXTJS 下载
  6. SQL执行并返回执行前/后结果
  7. Tomcat热部署,Web工程中线程没有终止
  8. Ubuntu16.04多个版本GCC编译器的安装和切换【转】
  9. java 反序列化 漏洞
  10. Mybatis动态SQL——if,where,trim,choose,set.foreach的用法