在继承下,为了使子类析构函数能够得到正常调用,需要将基类的析构函数设置为虚析构函数
什么情况下虚析构函数不正常调用?
子类对象指针赋值给基类指针,在调用析构函数时,子类对象的析构不会被调用
class Base{
public:
/*~Base(){
cout<<"Base::~Base()"<<endl;
}*/
virtual~Base(){
cout<<"Base::~Base()"<<endl;
}
};
class Drive:public Base{
public:
~Drive(){
cout<<"Drive::~Drive()"<<endl;
}
};
int main(){
/*
Base *p = new Drive();//早绑定,Drive强转成Base,p指向drive类中Base那部分
//析构也只会析构Base那部分
delete p;//子类不会被析构,如果有virtual p指向drive对象
*/
return 0;
}
设置虚析构函数是有代价的,编译器会为类生成虚函数表,每个对象都需要持有vptr