关于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!


浙公网安备 33010602011771号