知了博客

集天地之精华,吸日月之灵气

« singleton模式同事婚礼 »

虚析构函数

虚析构函数

在析构函数前面加上关键字virtual进行说明,称该析构函数为虚析构函数。例如:



class B

{

virtual ~B();



};



该类中的析构函数就是一个虚析构函数。



如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual进行说明。



说明虚析构函数的目的在于在使用delete运算符删除一个对象时,能保析构函数被正确地执行。因为设置虚析构函数后,可以采用动态联编方式选择析构函数。



下面举一个用虚析构函数的例子。



#include



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.



的结果。
  • 相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Arwen Build 90619 Code detection by Codefense  theme by BokeZhuti

Copyright know blog. Some Rights Reserved.站长(msn):webmaster#webgou.info(#换成@) 粤ICP备09183716号