C++语言程序设计

下面，创建了一个Picture对象，并通过抽象类指针操作。当该对象推迟释放时，我们遇到麻烦：
Shape * pShape; // 抽象类指针
pShape = new Picture ();
....
pShape->draw (); // 用Shape指针操作
// 现在，我们要销毁对象
delete pShape; // 只调用了Shape::~Shape ()!
// 错误：Picture 部分保持不变
在delete操作中，Shape的析构函数不会释放Picture的数据成员，导致内存泄露。为了抽象类指针能够调用正确的析构函数，应将析构函数定义为虚函数。这样，delete能够根据运行时对象的类型，动态地绑定析构函数，确保正确的析构函数被调用。
class Shape
{
...
virtual ~Shape () {}
};
...
class Picture : public Shape
{
...
~Picture (); // 自动成为虚函数
};
...
Shape * pShape = new Picture ();
...
delete pShape; // 正确: 调用Picture::~Picture ()
虚析构函数也可以定义为纯虚函数，称为纯虚析构函数。不象其它纯虚函数，即使在派生类中，纯虚析构函数被再定义，它也不能被覆盖。
所以，纯虚析构函数是一个例外，如果某一个析构函数定义为纯虚函数，还必须有该纯虚析构函数的实现，否则，会产生编译错误。例如：
class Interface
{
public:
virtual void Open() = 0;
virtual ~Interface() = 0;
};
Interface类定义了纯虚析构函数，在类外，我们我们必须有该该纯虚析构函数的实现：
Interface::~Interface()
{} //纯虚析构函数的实现总是空的