虚析构函数

虚析构函数

在析构函数前面加上关键字virtual进行说明,称该析构函数为虚析构函数。例如:
class B
{
    virtual ~B();
    …
};

 该类中的析构函数就是一个虚析构函数。
 如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual进行说明。
说明虚析构函数的目的在于在使用delete运算符删除一个对象时,能保析构函数被正确地执行。因为设置虚析构函数后,可以采用动态联编方式选择析构函数。

下面举一个用虚析构函数的例子。
#include <iostream.h>
class A
{
public:
  virtual ~A() { cout<<"A::~A() Called./n"; }
};

class B : public A
{
public:
  B(int i) { buf = new char[i]; }
  virtual ~B()
 {
    delete [] buf;
    cout<<"B::~B() Called./n";
  }
private:
   char * buf;
};

 

    void fun(A *a)

    {

    delete a;

    }

 

void main()
{
A *a = new B(15);
fun(a);
}

执行该程序输出如下结果:

B::~B() Called.
A::~A() Called.

如果类A中的析构函数不用虚函数,则输出结果如下:
A::~A() Called.

当说明基类的析构函数是虚函数时,调用fun(a)函数,执行下述语句:
delete a;
由于执行delete语句时自动调用析构函数,采用动态联编,调用它基类的析构函数,所以输出上述结果。
当不说明基类的析构函数为虚函数时,delete隐含着对析构函数的调用,故产生
A::~A() Called.
的结果。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值