没有使用虚析构函数可能会出现的问题:

#include <iostream>
#include <string>
using namespace std;class A {
public:A() { cout << "A constructor" << endl; }~A() { cout << "A destructor" << endl; }
};class B: public A {char *buf;
public:B() { buf = new char[10]; cout << "B constructor" << endl; }~B() { cout << "B destructor" << endl; }
};int main()
{A *p = new B;delete p;  // p是基类类型指针,仅调用基类析构函数,造成B中申请的10字节内存没被释放。return 0;
}

输出:

A constructor
B constructor
A destructor

解决:将基类中的析构函数定义为虚析构函数

#include <iostream>
#include <string>
using namespace std;class A {
public:A() { cout << "A constructor" << endl; }virtual ~A() { cout << "A destructor" << endl; }
};class B: public A {char *buf;
public:B() { buf = new char[10]; cout << "B constructor" << endl; }~B() { cout << "B destructor" << endl; }
};int main()
{A *p = new B;delete p; //A中的析构函数说明为虚析构函数后,B中析构函数自动成为虚析构函数,由于P
                  //指向派生类对象,因此会调用派生类B的析构函数。return 0;
}

输出:

A constructor
B constructor
B destructor
A destructor

转载于:https://www.cnblogs.com/helloweworld/archive/2013/01/13/2858785.html

为什么一般要定义析构函数为虚析构函数相关推荐

  1. c++析构函数、虚析构函数、纯虚析构函数详解

    我们知道对象在结束其生命周期之前,都会调用析构函数以完成必要的清理工作:派生类调用的析构函数顺序是"先子类,后基类": 这篇文章用于总结当析构函数是普通析构函数.虚析构函数.纯虚析 ...

  2. 析构函数、虚析构函数、纯虚析构函数

    我们知道对象在结束其生命周期之前,都会调用析构函数以完成必要的清理工作:派生类调用的析构函数顺序是"先子类,后基类": 这篇文章用于总结当析构函数是普通析构函数.虚析构函数.纯虚析 ...

  3. 析构函数和虚析构函数

    析构函数和虚析构函数 析构函数 虚析构函数 析构函数 析构函数与构造函数对应,当对象结束其生命周期,系统会自动执行析构函数.它不能带任何参数,也没有返回值(包括void类型).只能有一个析构函数,不能 ...

  4. 面试中常被问到(五)C++析构函数,虚析构函数

    C++析构函数 (1)对于析构函数:析构函数与构造函数相呼应,从调用构造函数开始到自动执行析构函数二者调用期间即为所创建对象实例的生命周期. (2)析构函数与类名相同,仅前面加一个~,一般析构函数无参 ...

  5. C++为什么父类析构函数要定义为虚析构函数

    C++为什么父类析构函数要定义为虚析构函数 这个问题主要是由于子类继承父类时,构造函数和析构函数的调用问题产生的结果: 第一点我们需要知道,子类在继承时构造函数是不能被继承的.但是,为了初始化从父类继 ...

  6. 虚函数,虚析构函数,纯虚函数

    虚函数 虚函数:虚函数是运行时多态,若某个基类函数声明为虚函数,则其公有派生类将定义与其基类虚函数原型相同的函数.那么,当基类指针或基类引用操作派生类对象时,系统会自动用派生类中的同名函数代替基类虚函 ...

  7. C++虚函数、虚析构函数浅析

    C++虚函数浅析 虚函数的工作原理: 虚析构函数: C++中的静态联编和动态联编 学习过C++的都知道可以通过虚函数实现多态.在基类中定义一个虚函数,在派生类中可以重写这个虚函数,实现派生类自己的特性 ...

  8. C++中的虚析构函数

    Cpp中的虚析构函数 1.虚析构函数的作用:为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用到.即虚析构函数使得在删除指向子类对象的基类指针时,可以调用子类的析构函数来实现释放子类中堆内存的 ...

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

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

最新文章

  1. SAL-9 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'...
  2. 华人小哥控诉机器学习四大 Boring!CS 博士:深有同感,正打算退学
  3. android webview拍照,在android 2.2/2.3中使用webview从camera中照相并且上传的实现
  4. CRDT——解决最终一致问题的利器
  5. 如何给 SAP Spartacus cxOutletPos 赋值
  6. fcntl函数之文件锁 F_SETLKW
  7. python 文本相似度_【机器学习】使用gensim 的 doc2vec 实现文本相似度检测
  8. 网络七大趋势 媒介将很快彻底消失
  9. mac版锐捷显示无法连接到服务器,MAC升级10.9后校园网(锐捷)客户端无法连接怎么办?...
  10. arduino:废旧光驱DIY激光雕刻机(完善中……)
  11. Playrix《梦想小镇》为何能成为10亿美元独角兽?
  12. 网络安全认证与加密协议算法整合
  13. js模仿微信打飞机游戏代码
  14. mysql查询表的列名_查看表所有列名SQL
  15. OrgChart组织架构图控件
  16. 常用 APP URL Scheme
  17. 网络分析仪测试线损_手把手教你用2端口网络分析仪进行阻抗调试分析--网络分析仪维修...
  18. 返回上一页面刷新与不刷新的方法
  19. 人机交互设备(HID)
  20. 为什么那么多人想开发一元夺宝类app?

热门文章

  1. DeepFake 入门了解
  2. python基础练习(十)
  3. xshell如何登陆数据库_Xshell连接远程服务器和操作数据库
  4. 进阶学习(3.8) Component Pattern 组合模式
  5. 怎么做网络推广浅析网站如何设置导航栏可以使网站优化更好?
  6. 浅析从小米造车背后探索小米集团的企业网络推广策略会有怎样的灿烂
  7. 浅析网站设计风格对网站建设的重要性
  8. 浅析搜索引擎对网站的抓取规则有哪些方面
  9. linux命令匹配path顺序,PATH 中的路径先后顺序的问题
  10. 完整计算机组成系统,计算机组成原理与完整系统结构.doc