首页 > 其他 > 详细

虚析构函数

时间:2014-03-11 09:49:07      阅读:474      评论:0      收藏:0      [点我收藏+]
当派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后再调用基类的析构函数。
如果用new运算符建立了临时对象,若基类中有析构函数,并且定义了一个指向该基类的指针变量。在程序用带指针参数的delete运算符撤销对象时,会发生一个情况:系统会只执行基类的析构函数,而不执行派生类的析构函数。

析构函数也可以是虚的,甚至是纯虚的。
例如:
class A
{
	public: 
		 virtual ~A()=0; // 纯虚析构函数
}; 
当一个类打算被用作其它类的基类时,它的析构函数必须是虚的。

考虑下面的例子:
class A
{
	public: A() 
	{ 
		ptra_ = new char[10];
	}
	 ~A() 
	{
		delete[] ptra_;
	} // 非虚析构函数
	private: 
		char * ptra_;
};

class B: public A
{
	public: B() 
	{ 
		ptrb_ = new char[20];
	} 
	~B() 
	{ 
		delete[] ptrb;
	}
	private: 
		char * ptrb;
};

void foo()
{ 
	 A * a = new B; 
	 delete a;
} 
在这个例子中,程序也许不会象你想象的那样运行,在执行delete a的时候,实际上只有A::~A()被调用了,而B类的析构函数并没有被调用!这是否有点儿可怕? 
如果将上面A::~A()改为virtual,就可以保证B::~B()也在delete a的时候被调用了。因此基类的析构函数都必须是virtual的。 
通常只有在希望将一个类变成抽象类(不能实例化的类),而这个类又没有合适的函数可以被纯虚化的时候,可以使用纯虚的析构函数来达到目的。

当基类的析构函数为虚函数时,无论指针指的是同一类族中的哪一个类对象,系统会采用动态关联,调用相应的析构函数,对该对象进行清理工作。如果将基类的析构函数声明为虚函数时,由该基类所派生的所有派生类的析构函数也都自动成为虚函数,即使派生类的析构函数与基类的析构函数名字不相同。

最好把基类的析构函数声明为虚函数。这将使所有派生类的析构函数自动成为虚函数。这样,如果程序中显式地用了delete运算符准备删除一个对象,而delete运算符的操作对象用了指向派生类对象的基类指针,则系统会调用相应类的析构函数。虚析构函数的概念和用法很简单,但它在面向对象程序设计中却是很重要的技巧。

专业人员一般都习惯声明虚析构函数,即使基类并不需要析构函数,也显式地定义一个函数体为空的虚析构函数,以保证在撤销动态分配空间时能得到正确的处理。

构造函数不能声明为虚函数。这是因为在执行构造函数时类对象还未完成建立过程,当然谈不上函数与类对象的绑定。

虚析构函数,布布扣,bubuko.com

虚析构函数

原文:http://blog.csdn.net/magicharvey/article/details/20838955

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!