八叶一刀·无仞剑

万物流转,无中生有,有归于无

导航

为多态基类声明多态析构函数

Posted on 2016-06-16 10:28  闪之剑圣  阅读(221)  评论(0编辑  收藏  举报

考虑以下类的结构:

class Base
{
public:
	Base(){}
	~Base(){}
	virtual void doSth(){}
};
class Derived:public Base
{
public:
	Derived(){}
	~Derived(){}
	void doSth(){}
};

  假设接下来有如下代码:

Base* b=new Derived;
delete b;

   那么当进行到delete b这一句的时候会发生内存泄露。因为C++明确指出,当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果是未定义的,通常发生的是对象的derived class成分未被销毁。

     消除这个问题的做法是给base class一个virtual的析构函数:

class Base
{
public:
	Base(){}
	virtual ~Base(){}
	virtual void doSth(){}
};

  一般而言,只有当基类具有virtual函数,或者说是为了具备多态性的时候,才有必要声明virtual的析构函数。