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

 

一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我们通过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 ();     // 虚析构函数
		...
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值