Effective C++ Item 07: 为多态基类声明virtual析构函数

声明virtual函数

我们有一个TimeKeeper的基类, 有一些子类作为不同的计时方法。

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

我们设计一个工厂函数, 使之返回一个base的指针,指向derive的对象。

TimeKeeper* ptk = GetTimeKeeper();

...

delete ptk;

为了避免泄露内存, 我们需要在结束时delete指针,而问题在于getTimeKeeper返回的指针是一个基类指针, 而指向一个派生类的对象,目前的base类拥有一个no-virtual的析构函数。

当一个derive对象经由一个base指针来删除,会导致未定义的行为。对象的子类独有的资源可能未被销毁,造成局部销毁的现象。

解决问题的方法就是将基类的析构函数声明为virtual,这样就会销毁整个对象。

class TimeKeeper
{
public:
	TimeKeeper();
	virtual ~TimerKeeper();
	...
};
TimeKeeper* ptk = getTimeKeeper();
...
delete ptk;

任何一个base类, 如果它含有virtual的函数, 就应该将其析构函数声明为virtual。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值