为什么一般要定义析构函数为虚析构函数

系统 1541 0

没有使用虚析构函数可能会出现的问题:

      #include <iostream>

#include <string>

using namespace std;



class A {

public:

	A() { cout << "
      
        A constructor
      
      " << endl; }

	~A() { cout << "
      
        A destructor
      
      " << endl; }

};



class B: public A {

	
      
        char
      
       *buf;

public:

	B() { buf = new 
      
        char
      
      [10]; cout << "
      
        B constructor
      
      " << endl; }

	~B() { cout << "
      
        B destructor
      
      " << endl; }

};




      
        int
      
       main()

{

	A *p = new B;

	delete p;  // p是基类类型指针,仅调用基类析构函数,造成B中申请的10字节内存没被释放。

	
      
        return
      
       0;

}




    

 

 

输出:

A constructor
B constructor
A destructor

 

解决:将基类中的析构函数定义为虚析构函数

      #include <iostream>

#include <string>

using namespace std;



class A {

public:

	A() { cout << "
      
        A constructor
      
      " << endl; }

	virtual ~A() { cout << "
      
        A destructor
      
      " << endl; }

};



class B: public A {

	
      
        char
      
       *buf;

public:

	B() { buf = new 
      
        char
      
      [10]; cout << "
      
        B constructor
      
      " << endl; }

	~B() { cout << "
      
        B destructor
      
      " << endl; }

};




      
        int
      
       main()

{

	A *p = new B;

	delete p; //A中的析构函数说明为虚析构函数后,B中析构函数自动成为虚析构函数,由于P
    
                        //指向派生类对象,因此会调用派生类B的析构函数。

	
      
        return
      
       0;

}




    

 

 

输出:

A constructor
B constructor
B destructor
A destructor

为什么一般要定义析构函数为虚析构函数


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论