为什么C++中父类的析构函数经常声明为虚函数

在Effective C++ 中,Scott Meyers在《条款07:为多态基类声明virtual析构函数》中提到,当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义——实际执行时通常发生的是对象的derived成分没有被销毁。也就是说,如果派生类继承了父类的情况下,如果父类的析构函数不是虚函数,而在使用中用了多态的写法,就会导致没有调用到派生类的析构函数,导致资源没有释放,造成泄漏。

先看一个错误的写法:

class TimeKeeper {
public:
TimeKeeper();
~TimeKeeper();
}
class AtomicClock: public TimeKeeper{...};
class WaterClock: public TimeKeeper{...};

TimeKeeper* ptk = getTimeKeeper(); //假设这里获取的是AtomicClock实例。
delete ptk;//仅调用了TimeKeeper的析构函数,没有调用到AtomicClock的析构函数,容易造成AotmicClock中的资源未被释放。

正确写法:

​
class TimeKeeper {
public:
TimeKeeper();
virtual ~TimeKeeper();
}
class AtomicClock: public TimeKeeper{...};
class WaterClock: public TimeKeeper{...};

TimeKeeper* ptk = getTimeKeeper(); //假设这里获取的是AtomicClock实例。
delete ptk;//因为父类中的析构函数为虚函数,会调用派生类的虚函数,释放掉AtomicClock的资源。
​

 

转载于:https://my.oschina.net/shaorongjie/blog/776253

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值