#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; } };则程序的输出变为:
本文链接:http://task.lmcjl.com/news/17522.html