一、中心内容
1、polymorphic(带多态性质的)base classes应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数;
2、Classes的设计目的如果不是作为base Classes使用,或不是为了具备多态性,就不该声明virtual析构函数。
二、内容简介
1、资源泄漏
class TimeKeeper{
public:
TimeKeeper();
~TimeKeeper();
......
};
class AtomicClock: public TimeKeeper{...};
class WaterClock: public TimeKeeper{...};
class WristWatch: public TimeKeeper{...};
int main
{
TimeKeeper* ptk = getTimeKeeper();//getTimekeeper()返回一个指针,指向一个派生类的动态分配的指针
......
delete ptk;
}
note:
1、问题出在基类的析构函数不是virtual的;
因为getTimeKeeper()返回的指针指向一个派生类对象,而那个对象却经由一个基类指针被删除,所以可能会造成对象的衍生部分没有被销毁,造成“局部销毁”的现象。
2、解决办法:给基类加上一个virtual析构函数
class TimeKeeper{
public:
TimeKeeper();
virtual ~TimeKeeper();
......
};
任何class只要带有virtual函数几乎确定应该也有一个virtual析构函数
2、若class不含virtual函数,通常表示它并不意图被用作一个基类
这时候不要令析构函数为virtual!!!
(1)一般不要继承不含任何virtual函数的类。比如:string,vector, list, set......
(2)抽象类
抽象类是由pure virtual析构函数导致的,它不能够实体化,也就是说不能为其创建对象。
所以当你希望有一个抽象类时,为其声明一个pure virtual析构函数。。
e.g
class AWOV{
public:
virtual ~AWOV() = 0;//声明一个pure virtual析构函数
};
AWOV::~AWOV(){}//还得给此析构函数一个定义,不然连接器会出错
note:
析构函数的运作方式:
先调用最深层次的那个class的析构函数最先被调用,然后是其每一个基类class的析构函数被调用