虚析构函数:
虚析构函数是为了解决基类指针指向派生类对象,并用基类指针删除派生类对象时能够完全释放内存。
class A1{
public:
~A1(){cout<<"A1"<<endl;}
};
class A2{
public:
virtual ~A2(){cout<<"A2"<<endl;}
} ;
class B1:public A1{
public:
~B1(){cout<<"B1"<<endl;}
};
class B2:public A2{
public:
~B2(){cout<<"B2"<<endl;}
};
int main(){
A1* a1=new B1;
A2* a2=new B2;
delete a1; //调用基类析构函数,显示:A1(派生类并没有被删除)
delete a2; //先调用派生类析构函数,再调用基类虚析构函数。显示:B2 A2
return 0;
}
一般来说,如果类中不包含虚函数,就表示这个类不作为基类使用。
如果声明纯虚的析构函数,则必须为纯虚析构函数提供一个函数体。纯虚析构函数的作用是可以使基类成为一个抽象类,不能创建基类对象。
析构函数的虚机制:
对于在析构函数中调用虚函数,则虚函数机制将被忽略,即只调用本地版本。如果虚机制存在。则析构函数从派生类到基类按层次调用,可能会出现被调用的函数操作在已经被删除的对象上。(例如基类析构函数中的虚函数调用派生类版本,此时派生类已经被删除)