C++之虚析构函数
用法:当且仅当类中包含一个以上的虚函数时才将析构函数设置为虚函数;
- 无故将类的析构函数设置为虚函数会影响性能,因为它会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性。
- 当类中包含纯虚函数时,该类为抽象类,具有作为基类的打算,若析构函数未申明为纯虚函数可能会造成内存泄漏。
解决的问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象
鸡生蛋蛋生鸡:抽象类是为基类准备的,基类中必然要有虚析构函数,抽象类中必然会有纯虚函数。
应用举例
include
#include<iostream>
using namespace std;
class Base
{
public:
Base() { cout <<"contructor Base!"<<endl; };
~Base() { cout<<"destructor Base!"<<endl; }
}
class Child : public Base
{
public:
Child() { cout <<"contructor Child!"<<endl; };
~Child() { cout <<"destructor Child!"<<endl; };
}
int main()
{
Base *pBase = new Child();
delete pBase;
pBase = null;
return 0;
}
运行结果:
contructor Base!
constructor Child!
destructor Base!
delete pBase只调用基类的析构函数,未调用子类的析构函数,所以基类的析构函数不是纯虚函数时,会造成内存泄漏。
通常情况下,程序员的经验是,当类中存在虚函数时要把析构函数写成virtual,因为类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时如果派生类的构造函数中有用new动态产生的内存,那么在其析构函数中务必要delete这个数据,但是一般的像以上这种程序,这种操作只调用了基类的析构函数,而标记成虚析构函数的话,系统会先调用派生类的析构函数,再调用基类本身的析构函数。