如果析构函数不是虚的,则只将调用对应于指针类型的析构函数
#include <iostream>
using namespace std;
class Father{
public:
void show(){
cout<<"I am father"<<endl;
}
~Father(){
cout<<"father destructor func"<<endl;
}
};
class Son :public Father{
public:
void show() {
cout<<"I am son"<<endl;
}
~Son(){
cout<<"Son destructor func"<<endl;
}
};
int main(int argc, char *argv[])
{
Father *s = new Son;
delete s;
return 0;
}
运行结果:
father destructor func
可是我们new 的是Son的对象
解决方法:
父类析构函数定义为虚析构函数,假设父类指针指向子类对象,此时也会按照顺序来释放,先调用子类对象的析构函数,然后调用父类对象的析构函数
同样的,子类指针指向子类对象,也会按照顺序来释放,先调用子类对象的析构函数,然后调用父类对象的析构函数
#include <iostream>
using namespace std;
class Father{
public:
void show(){
cout<<"I am father"<<endl;
}
virtual ~Father(){
cout<<"father destructor func"<<endl;
}
};
class Son :public Father{
public:
void show() {
cout<<"I am son"<<endl;
}
~Son(){
cout<<"Son destructor func"<<endl;
}
};
int main(int argc, char *argv[])
{
Father *s = new Son;
delete s;
return 0;
}
运行结果:
Son destructor func
father destructor func