Effective C++学习7 条款07:为多态基类声明virtual析构函数

这一点我在以前的博客中有提到过。在MFC中的最初基类:CObject就是使用virtual析构函数。究其原因,就是为了在delete的时候可以做到更安全。例子入下:

这个代码是编译正确的,但是如果仔细看,你会发现这里的delete很有问题,是一个会带来灾难的代码。我们看到这里delete的是ptb,而ptb是base类的指针,由于析构没有virtual关键词,所以这里会调用base类的析构函数,那么在derived类中新申请出来的空间就没有被释放掉,那么内存就泄露了!所以这个代码极其危险,而避免这个危险的方法就是将基类的析构代码声明为virtual。那么即使使用base的指针去delete,程序依然会调用正确的析构函数。

那么是不是所有的class都加上virtual析构函数以保万一,事实不是如此。如果没有必要,请不要为析构函数加上virtual二字。原因是virtual是有代价的,为了实现virtual函数,类中间必须要增加一个pointer指向虚函数表,这样增大了类的体积。所以没有必要的话,还是不要随意声明virtual的析构函数。

普遍的规则是只有当类当中有virtual的函数时,析构函数才声明为virtual。也就是说这个基类是有多态性质(polymorphic)的。

不过还有一个问题,那就是继承那些不带virtual函数的标准类库的类,比如string类。如果你继承了string类,那么当你使用string的指针释放你的继承类的话,依然存在上面描述的问题,你的继承类没有释放它该释放的空间。因为string没有virtual的析构函数。所以请不要去继承这些并没有virtual析构函数的类。

对于某些类,我们甚至可以把它变成一个抽象函数,也就是拥有纯虚函数的类。具体实施方法就是将析构函数声明为纯虚函数。不过这里还需要为这个纯虚函数一个定义,因为derived类会需要调用基类的析构函数,如果没有定义,会出现连接错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值