一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我们通过virtual 析构函数,这样就可以实现当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用(因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,所以派生类的析构函数能够调用)。
当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。
下述两种情况不用virtual析构函数:
(1).如果一个类不会被继承,即没有子类;
(2).或者一些类尽管可能会被继承,但不会被使用成多态的,即除了析构函数外,没有其他的方法是virtual的,这时就可以把virtual属性去掉(因为这个必须在多态的基础上才能实现的)。
总而言之,要用的情况无非是多态情况下(类多态的必要条件:继承,Virtual函数)。
(1).带多态性质的基类应该声明为一个virtual 析构函数;
(2).如果类带有任何 virtual 函数,它就应该拥有一个 virtual 析构函数
备注:
只需要把基类的析构函数声明为虚函数,即虚析构函数,这样当撤销基类对象的同时也撤销派生类的对象,这个过程是动态关联完成的。
如果将基类的析构函数声明为虚函数时,由该基类所派生的所有派生类的析构函数都自动成为虚函数,即使派生类的析构函数与基类的析构函数名字不相同。
代码示例:
class TimeKeeper
{
public:
TimeKeeper();
virtual ~TimeKeeper(); // 虚析构函数
...
}
class AtomicClock : public TimeKeeper
{
public:
AtomicClock ();
~AtomicClock (); // 虚析构函数
...
}