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

一、中心内容

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的析构函数被调用


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值