#include <iostream>
using namespace std;
/*
虚析构函数
为什么需要虚析构函数?
可能通过基类指针删除派生类对象;
如果你打算允许其他人通过基类指针调用对象的析构函数(通过delete这样做是正常的),
就需要让基类的析构函数成为虚函数,否则执行delete的结果是不确定的。
*/
/*
一个不使用虚析构函数的例子
class Base {
public:
~Base(); //不是虚函数
};
Base::~Base() {
cout<< "Base destructor" << endl;
}
class Derived: public Base{
public:
Derived();
~Derived(); //不是虚函数
private:
int *p;
};
*/
//用了虚析构函数的例子
class Base {
public:
virtual ~Base();
};
Base::~Base() {
cout<< "Base destructor" << endl;
}
class Derived: public Base{
public:
Derived();
virtual ~Derived();
private:
int *p;
};
Derived::Derived(){
p = new int(0);
}
Derived::~Derived(){
cout << "Derived destructor" << endl;
delete p;
}
void fun(Base* b){
delete b; //不用虚析构函数时,静态绑定,只会调用 ~Base();
}
int main()
{
Base *b = new Derived();
fun(b);
return 0;
}
用虚析构函数与不用的对比
最新推荐文章于 2022-09-06 09:28:17 发布