面试(七)为什么一般希望将析构函数定义为虚函数
class B
{
public:~B() // 基类析构函数不为虚函数{cout << "B::~B()" << endl;}
};class D : public B
{
public:~D(){cout << "D::~D()" << endl;}
};void Test(B* t)
{delete t;t = nullptr;
}int main()
{B *pb = new B;Test(pb);D* pd = new D;Test(pd);return 0;
}
简单梳理,B为基类,D为子类
在使用多态时,没有将B的析构函数定义为虚函数
打印结果为:
修改代码,对基类析构函数引入virtual关键字修饰。打印结果为右下图:
现象:基类析构为虚函数时,当delete子类的对象指针时会同时调用基类的析构函数,然而上方没有对基类作为虚函数的例子不会对基类指针部分进行释放资源
结论:如果将基类析构函数定义为虚函数,则会避免执行某些操作时产生的资源泄露
例如此处delete子类指针时,不仅会调用子类析构函数,而且也会调用基类析构,避免了内存泄露
class B
{
public:virtual ~B() // 虚函数修饰基类析构函数{cout << "B::~B()" << endl;}
};class D : public B
{
public:~D(){cout << "D::~D()" << endl;}
};void Test(B* t)
{delete t;t = nullptr;
}int main()
{B *pb = new B;Test(pb);D* pd = new D;Test(pd);return 0;
}