有继承的C++析构函数一定要用virtual
来源:互联网 发布:什么是淘宝客服工作 编辑:程序博客网 时间:2024/06/03 18:37
先补下virtual是啥
虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。
先贴个代码,再解释
#include <iostream>using namespace std;class Base{public: Base(){cout<<"Base Construct"<<endl;}; ~Base(){cout<<"Base destroy"<<endl;} };class A : public Base{public: A(){cout<<"A Construct"<<endl;} ~A(){cout<<"A destroy"<<endl;}};class Base1{public: Base1(){cout<<"Base1 Construct"<<endl;}; virtual ~Base1(){cout<<"Base1 destroy"<<endl;} };class A1 : public Base1{public: A1(){cout<<"A1 Construct"<<endl;} ~A1(){cout<<"A1 destroy"<<endl;}};int main(){ Base* p = new A; delete p; cout<<"======================"<<endl; Base1* p1 = new A1; delete p1; return 0;}/* Base Construct A Construct Base destroy ====================== Base1 Construct A1 Construct A1 destroy Base1 destroy*/
在代码尾部的注释就是输出。
Base的析构函数没有virtual
Base1的析构函数有virtual
Base* p = new A
delete p
这个过程只调用了Base的析构函数,没有调用A的析构函数。
这样在实际应用中会有不确定的后果,可能会memory leak
应该在A的析构函数中我们可能会销毁一些其他的资源,而这里并未调用。
所以要给Base的析构函数以virtual属性。
0 0
- 有继承的C++析构函数一定要用virtual
- 继承基类析构函数一定要加上virtual
- [c/c++]析构函数virtual相关
- [C++]把析构函数声明为virtual有什么好处?
- 为什么需要将继承层次中类的析构函数定义成virtual的?
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- 【C++】析构函数和virtual函数引发的隐晦问题 ——《Effective C++》
- C++ virtual 继承
- C++virtual继承
- C++(2)继承/virtual
- 《Effective C++》读书笔记之item36:绝不重新定义继承而来的non-virtual函数
- Effective C++:条款36:绝不重新定义继承而来的non-virtual函数
- c++:不要重新定义继承而来的non-virtual函数
- 绝对不要重新定义继承而来的non-virtual函数(Effective C++_36)
- 《Effective C++》36:绝不重新定义继承而来的non-virtual函数
- 字典树的应用 单词意义查找-C语言实现
- hadoop中最简单最简单的map-reduce
- 前台jsp控件获取java后台返回的值
- NYOJ 362 解题报告
- 循环语句的小程序
- 有继承的C++析构函数一定要用virtual
- iOS C语言4_一维数组
- Sublime Text2使用技巧
- hmm-前向算法
- Xen虚拟机桥接网络配置
- SQL server 存储过程
- ★C++课程实训:银行储蓄系统(多文件组织)
- Android开发之多级下拉列表菜单实现(仿美团,淘宝等)
- Uva 437 巴比伦塔 && UVA10003