关于C++虚析构函数
/***这个低端了,之前我还不知道虚析构函数的作用***/
先看一个例子
#include <iostream> using namespace std; class Base{ public: Base(){ cout<<"Base constructed!"<<endl;//基类构造函数 } ~Base(){ cout<<"Base1 destructed!"<<endl;//基类析构 } }; class Deliver1:public Base{ public: Deliver1(){ cout<<"Deliver1 constructed!"<<endl;//派生1构造 } ~Deliver1(){ cout<<"Deliver1 destructed!"<<endl;//派生1析构 } }; class Deliver2:public Deliver1{ public: Deliver2(){ cout<<"Deliver2 constructed!"<<endl;//派生2构造 } ~Deliver2(){ cout<<"Deliver2 destructed!"<<endl;//派生2析构 } }; int main(){ Deliver2 D; return 0; }
那么运行的结果如下:
Base constructed!
Delever1 constructed!
Deliver2 constructed!
Deliver2 destructed!
Deliver1 destructed!
Base destructed!
如果哦使用动态元素,即main函数变为:
int main(){
Base1 *D=new Deliver2();
delete D;
return 0;
}
Base1 *D=new Deliver2();
delete D;
return 0;
}
则运行结果如下
Base constructed!
Delever1 constructed!
Deliver2 constructed!
Base destructed!
恐怖的事情就这样发生了,析构函数只调用了基类的,子类的资源全没有释放!
于是就有了虚析构函数
我们知道,如果一个函数在基类中被定义为虚函数,那么不管派生类有没有加virtual关键字,这个函数都是虚函数。
同样的,如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual。
于是我们把基类的析构函数改写为:
virtual ~Base(){
cout<<"Base1 destructed!"<<endl;//基类析构
}
cout<<"Base1 destructed!"<<endl;//基类析构
}
那么运行结果就正常了
Base constructed!
Delever1 constructed!
Deliver2 constructed!
Deliver2 destructed!
Deliver1 destructed!
Base destructed!