### 举例说明析构函数为何设计为虚函数

答案：

如果我们在一个子类的构造函数中分配了一个堆空间，然后在子类的析构函数中释放堆空间。当我们定义一个父类的指针对象，利用子类的构造函数为其构建对象时，当释放父类的指针对象时将导致内存泄露。因为子类的析构函数不时虚函数，在父类对象释放时，它不会采用动态绑定的方式调用到子类的构造函数。因此，在设计析构函数时，通常将析构函数设置为虚函数。

例如：

class CPerson //定义一个 CPerson 类

{

protected:

char * m_pszName;

public:

CPerson()

{

m_pszName = new char[128];

}

virtual ~CPerson() //虚函数

{

delete [] m_pszName;

}

};

class CStudent: public CPerson //从 CPerson 派生一个子类

{

private:

char * m_pszClass;

int m_nAge;

public:

CStudent()

{

m_nAge = 15;

m_pszClass = new char[128];

}

virtual ~CStudent() //虚函数

{

m_nAge = 0;

delete []m_pszClass;

}

};

int main(int argc, char* argv[])

{

CPerson *pPerson = new CStudent(); //利用子类的构造函数构建对象

delete pPerson;

return 0;

}