C++之虚析构函数

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这个数据,但是一般的像以上这种程序,这种操作只调用了基类的析构函数,而标记成虚析构函数的话,系统会先调用派生类的析构函数,再调用基类本身的析构函数。

猜你喜欢

转载自blog.csdn.net/ty13438189519/article/details/79919463