• 简单的来说,虚函数的作用是当基类调用派生类的对象时,能够实现多态,即虚函数会优先调用派生类的对应函数。
  • 那么虚析构函数的作用:就是释放派生类的内存,防止内存泄漏。
    实例:
  • 第一种情况,当没有虚析构函数时:
// VirtualDemo.cpp : 定义控制台应用程序的入口点。
// 虚析构函数使用#include "stdafx.h"
#include <memory>
#include <iostream>
using namespace std;class A{public:A(){cout << "A Init()" << endl;}~A(){cout << "A Destroy()" << endl;}
};class B:public A{public:B(){cout << "B init()" << endl;}~B(){cout << "B destroy()" << endl;}
};void test()
{unique_ptr<A> demo(new B());
}int _tmain(int argc, _TCHAR* argv[])
{test();system("pause");return 0;
}

运行结果:

可以发现,只释放了A的内存,B的析构函数没有被调用

  • 接下来是添加虚析构函数的代码
// VirtualDemo.cpp : 定义控制台应用程序的入口点。
// 虚析构函数使用#include "stdafx.h"
#include <memory>
#include <iostream>
using namespace std;class A{public:A(){cout << "A Init()" << endl;}virtual ~A(){cout << "A Destroy()" << endl;}
};class B:public A{public:B(){cout << "B init()" << endl;}~B(){cout << "B destroy()" << endl;}
};void test()
{unique_ptr<A> demo(new B());
}int _tmain(int argc, _TCHAR* argv[])
{test();system("pause");return 0;
}

运行结果:

可以看出,此时B的析构函数也被调用,至于为什么也被调用,那就是虚函数表的作用,这个和虚函数的原理是一摸一样的,在此,不继续赘述了。能明白就还好~


重点:
只针对需要作为基类的包含虚函数的类才添加虚析构函数,其他的东西 添加纯属扯淡。

虚函数表在编译的时候就确定了,而类对象的虚函数指针vptr是在运行阶段确定的,这是实现多态的关键!

C++ 虚析构函数作用相关推荐

  1. c++接口与虚析构函数作用

    接口是一种编程思想,定义了一种编程规范,同时可以增强扩展性(多态),在C++中,某些抽象类也称为接口类,声明一个接口类需要满足以下几个条件: 1.类中所有的成员函数都是纯虚函数,2.没有定义成员变量. ...

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

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

  3. [C++]虚析构函数的作用

    C++中的虚析构函数到底什么时候有用的,什么作用呢. 一.虚析构函数的作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的.也就说虚析构函数使得在删除指向子类对象 ...

  4. C++中虚析构函数的作用及其原理分析

    参考http://blog.csdn.net/xiamentingtao/article/details/55517203 C++中的虚析构函数到底什么时候有用的,什么作用呢. 一.虚析构函数的作用 ...

  5. c++ 虚析构函数的作用

    文章目录 构造析构顺序 构造函数和析构函数的调用顺序 定义 原因 作用 代码 代码 构造析构顺序 构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用 ...

  6. C++中虚析构函数的作用及原理

    C++中虚析构函数的作用及原理 先测测你哟,上代码

  7. C++ 之虚析构函数的作用

    虚析构函数的作用: 析构函数是可以声明为虚函数的,如果基类指针指向一个new生成的派生类对象,通过delete作用于基类指针删除派生类对象时,有以下两种情况: 如果基类析构函数不为虚析构函数,则只会调 ...

  8. Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)

    源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...

  9. C++中虚析构函数和纯虚函数的作用

    一. 虚析构函数 为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数.因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数. class Base ...

最新文章

  1. 成长必须避开的5个陷阱
  2. pandas dataframe column_Python数据分析——Pandas 教程(下)
  3. 14.并发与异步 - 2.任务Task -《果壳中的c#》
  4. arm 开发工具比较(ADS vs RealviewMDK vs RVDS)
  5. 双重检查锁定及单例模式
  6. Python 这么简单还用学吗?
  7. Selenium 安装firebug和firepath
  8. DMZ区的介绍及连接图
  9. 如何在微信朋友圈分享网页内容的时候能够有缩略图
  10. 南方航空java面试_面试经验 南航面试经历分享
  11. 中学-知识与能力【6】
  12. Java - parseObject
  13. 智慧旅游建设智能化景区管理系统方案
  14. 如何注册个人邮箱?又应该如何选择邮箱呢?
  15. 计算二叉树宽度(二叉链表)
  16. 数据库原理与应用实验指导书 实验一:熟悉SQL Server 2012数据库管理系统
  17. 银行客户业务系统(JAVA,JSP,SQLSERVER)
  18. 2020-12-18:【黑盒测试用例设计】测试方法之场景法
  19. 如何使用Logger命令将消息添加到Linux日志文件
  20. 2015-2016-2(点集拓扑56, 点集拓扑56)

热门文章

  1. 京东面试题:ElasticSearch深度分页解决方案
  2. IntelliJ IDEA这样配置,代码效率嗖嗖的
  3. linux mysql-proxy 0.8.0_mysql主从复制及mysql-proxy0.8安装
  4. StringEscapeUtils的资料
  5. Java并发编程-BlockingQueue阻塞队列
  6. leetcode题解50-Pow(x,n)
  7. 大话数据结构 -07-1 图的定义、抽象数据类型与存储结构
  8. 指令数据采集(五)--指令的条件的执行判断
  9. Shiro学习(24)在线回话管理
  10. Git生成ssh密钥指定文件