有继承的C++析构函数一定要用virtual
2015-07-16 17:15
288 查看
先补下virtual是啥
虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。
先贴个代码,再解释
在代码尾部的注释就是输出。
Base的析构函数没有virtual
Base1的析构函数有virtual
Base* p = new A
delete p
这个过程只调用了Base的析构函数,没有调用A的析构函数。
这样在实际应用中会有不确定的后果,可能会memory leak
应该在A的析构函数中我们可能会销毁一些其他的资源,而这里并未调用。
所以要给Base的析构函数以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属性。
相关文章推荐
- ★C++课程实训:银行储蓄系统(多文件组织)
- C++ static 全局变量使用注意
- 字典树的应用 单词意义查找-C语言实现
- C语言实现串,和简单的主函数测试
- C++ 优先队列应用方法 浅析
- KMP算法-C语言程序实现
- C++转型操作符:const_cast, static_cast, dynamic_cast和reinterpret_cast
- POJ 2528 (线段树+离散化)
- OC基础11:基本的C语言特性2
- c语言的有趣之处
- OC基础11:基本的C语言特性2
- UVa540插队问题
- c++编程经验一
- c/c++常见编程错误
- c语言栈 《个人理解》
- C语言实现单链表,和测试主函数
- C++关键字mutable
- 零基础如何入门C语言
- P1133装箱问题
- C++中类成员函数未实现,是否能够编译链接通过?