#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()
{
}
effective C++学习---条款7:为多态基类声明Virtual析构函数
最新推荐文章于 2023-11-03 14:06:00 发布