#include <iostream>
using namespace std;
class CShape //基类
{
public:
~CShape() { cout << "CShape::destrutor" << endl; }
};
class CRectangle : public CShape //派生类
{
public:
int w, h; //宽度和高度
~CRectangle() { cout << "CRectangle::destrutor" << endl; }
};
int main()
{
CShape* p = new CRectangle;
delete p;
return 0;
}
程序的输出结果如下:delete p;只引发了 CShape 类的析构函数被调用,没有引发 CRectangle 类的析构函数被调用。这是因为该语句是静态联编的,编译器编译到此时,不可能知道此时 p 到底指向哪个类型的对象,它只根据 p 的类型是 CShape * 来决定应该调用 CShape 类的析构函数。delete p;会导致一个 CRectangle 类的对象消亡,应该调用 CRectangle 类的析构函数才符合逻辑,否则有可能引发程序的问题。delete p;这样的语句能够聪明地根据 p 所指向的对象执行相应的析构函数。实际上,这也是多态。为了在这种情况下实现多态,C++ 规定,需要将基类的析构函数声明为虚函数,即虚析构函数。
class CShape{
public:
virtual ~CShape() { cout << "CShape::destrutor" << endl; }
};
则程序的输出变为:
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有