您的位置:首页 > 其它

虚析构函数的作用

2012-04-26 10:23 288 查看
转自:http://hi.csdn.net/doer_ljy
如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字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.

的结果。

class   A
{
public:
virtual   ~A()   {   cout << "A::~A()   Called.\n ";   }
};

class   B   :   public   A
{
public:
B(int   i)   {   buf   =   new   char[i];   }
~B()
{
delete   []   buf;
cout <<"B::~B()   Called.\n ";
}
private:
char   *   buf;
};
class C:public B
{
public:
C(int i):B(i){}//派生类向基类传值
~C()
{
cout<<"C::~C() called\n";
}
};


只要基类声明了虚析构函数,则它所有的派生类均不用再将析构函数声明为虚的

思考下下面两段代码的输出:
代码1:
B *a = new C(7);

delete a;

代码2:
A *a = new C(7);

delete a;

两段代码均输出:

C::~C() called

B::~B() Called.

A::~A() Called.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: