effective C++学习---条款7:为多态基类声明Virtual析构函数

#include<iostream>
using namespace std;

/*
本条款使用的前提是存在多态基类的情况,先来复习一下多态的三个条件
要有继承
要有方法的重写(virtual)
要用父类指针指向子类对象

用基类指针指向父类对象,释放该指针时,就有泄露内存的风险
*/

class Timekeeper{
public:
	Timekeeper();
	~Timekeeper();
	//virtual ~Timekeeper();
};

class AtomicClock : public Timekeeper{ };
class WaterClock : public Timekeeper{ };
class WristClock : public Timekeeper{ };

void test01()
{
	AtomicClock atuo;
	Timekeeper  *ptk = &atuo;
	//使用完指针
	delete ptk;     //这是正常情况下的使用,但是这样做只是调用了基类的析构函数,
	                //那些在派生类中增加的部分是不会被释放的,造成空间泄露
}
/*
将基类的析构函数声明为虚函数,在这样就可以对派生类内存达到正确的释放
*/

/*
如果一个普通类没有考虑被当成基类,令其析构函数为虚函数就不太好。
因为声明虚函数会带来额外的内存开销
*/

/*
在标准库STL模板中声明的一些类,都属于没有写虚析构函数的,
以在类模板上进行派生时,当派生类对象传给基类指针时
容易出现以上内存释放不完全的情况出现
*/


/*
有时候会把抽象类和虚析构函数结合在一起
这样既满足抽象类的要求:抽象类不能实例化对象,派生类要对纯虚函数进行实例化
又满足虚析构函数的要求:可以正常的使用多态
但是这样在派生类中就一定要将纯虚函数进行实例化
*/

class AWOV{
public:
	virtual ~AWOV() = 0;
};
AWOV:: ~AWOV(){}

class BWOV :public AWOV{
public:
	
};
//书上说的是像上面这么做的,但是我在编译器中试的时候总是报错

/*
要注意的是在使用多态(基类中有虚函数)时才会声明虚析构函数
在普通的基类和派生类中就不需要这么用
*/
void main()
{
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值