C++ 虚析构函数作用
- 简单的来说,虚函数的作用是当基类调用派生类的对象时,能够实现多态,即虚函数会优先调用派生类的对应函数。
- 那么虚析构函数的作用:就是释放派生类的内存,防止内存泄漏。
实例: - 第一种情况,当没有虚析构函数时:
// 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++ 虚析构函数作用相关推荐
- c++接口与虚析构函数作用
接口是一种编程思想,定义了一种编程规范,同时可以增强扩展性(多态),在C++中,某些抽象类也称为接口类,声明一个接口类需要满足以下几个条件: 1.类中所有的成员函数都是纯虚函数,2.没有定义成员变量. ...
- C++中的虚析构函数
Cpp中的虚析构函数 1.虚析构函数的作用:为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用到.即虚析构函数使得在删除指向子类对象的基类指针时,可以调用子类的析构函数来实现释放子类中堆内存的 ...
- [C++]虚析构函数的作用
C++中的虚析构函数到底什么时候有用的,什么作用呢. 一.虚析构函数的作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的.也就说虚析构函数使得在删除指向子类对象 ...
- C++中虚析构函数的作用及其原理分析
参考http://blog.csdn.net/xiamentingtao/article/details/55517203 C++中的虚析构函数到底什么时候有用的,什么作用呢. 一.虚析构函数的作用 ...
- c++ 虚析构函数的作用
文章目录 构造析构顺序 构造函数和析构函数的调用顺序 定义 原因 作用 代码 代码 构造析构顺序 构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用 ...
- C++中虚析构函数的作用及原理
C++中虚析构函数的作用及原理 先测测你哟,上代码
- C++ 之虚析构函数的作用
虚析构函数的作用: 析构函数是可以声明为虚函数的,如果基类指针指向一个new生成的派生类对象,通过delete作用于基类指针删除派生类对象时,有以下两种情况: 如果基类析构函数不为虚析构函数,则只会调 ...
- Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)
源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...
- C++中虚析构函数和纯虚函数的作用
一. 虚析构函数 为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数.因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数. class Base ...
最新文章
- 成长必须避开的5个陷阱
- pandas dataframe column_Python数据分析——Pandas 教程(下)
- 14.并发与异步 - 2.任务Task -《果壳中的c#》
- arm 开发工具比较(ADS vs RealviewMDK vs RVDS)
- 双重检查锁定及单例模式
- Python 这么简单还用学吗?
- Selenium 安装firebug和firepath
- DMZ区的介绍及连接图
- 如何在微信朋友圈分享网页内容的时候能够有缩略图
- 南方航空java面试_面试经验 南航面试经历分享
- 中学-知识与能力【6】
- Java - parseObject
- 智慧旅游建设智能化景区管理系统方案
- 如何注册个人邮箱?又应该如何选择邮箱呢?
- 计算二叉树宽度(二叉链表)
- 数据库原理与应用实验指导书 实验一:熟悉SQL Server 2012数据库管理系统
- 银行客户业务系统(JAVA,JSP,SQLSERVER)
- 2020-12-18:【黑盒测试用例设计】测试方法之场景法
- 如何使用Logger命令将消息添加到Linux日志文件
- 2015-2016-2(点集拓扑56, 点集拓扑56)
热门文章
- 京东面试题:ElasticSearch深度分页解决方案
- IntelliJ IDEA这样配置,代码效率嗖嗖的
- linux mysql-proxy 0.8.0_mysql主从复制及mysql-proxy0.8安装
- StringEscapeUtils的资料
- Java并发编程-BlockingQueue阻塞队列
- leetcode题解50-Pow(x,n)
- 大话数据结构 -07-1 图的定义、抽象数据类型与存储结构
- 指令数据采集(五)--指令的条件的执行判断
- Shiro学习(24)在线回话管理
- Git生成ssh密钥指定文件