有时候,删除对象的时候需要进行多态,这个时候就需要将析构函数声明为虚函数。
有问题的代码:
#include <iostream>
using namespace std;
class Base {
public:
~Base(); //不是虚函数
};
Base::~Base() {
cout<< "Base destructor" << endl;
}
class Derived: public Base{
public:
Derived(){ p = new int(0);};
~Derived(){}; //不是虚函数
private:
int *p;
};
Derived::~Derived() {
cout<< "Derived destructor" << endl;
}
void fun(Base* base){
delete base;
};
int main(){
Base *b = new Derived();
fun(b);
return 0;
}
output:
Base destructor
代码的本意是func()
可以删除Base
类的对象以及所有Base
类的派生类对象,但因为声明的时候:Base *b = new Derived();
是按照Base类去声明,虽然指向的是Derived
类对象,但在调用fun()
函数的时候,依旧会调用Base
类的析构
因此,与普通析构函数一样,需要让代码在执行期再确定fun(Base* base)
的指向类型。
声明析构为虚函数:
#include <iostream>
using namespace std;
class Base {
public:
virtual ~Base();
};
Base::~Base() {
cout<< "Base destructor" << endl;
}
class Derived: public Base{
public:
Derived(){ p = new int(0);};
virtual ~Derived();
private:
int *p;
};
Derived::~Derived() {
cout<< "Derived destructor" << endl;
}
void fun(Base* base){
delete base;
};
output:
Derived destructor
Base destructor