虚析构函数
2017-06-05 16:02
85 查看
为了防止在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,所以析构函数要声明为虚函数。
#include <iostream> #include "vld.h" using namespace std; class Shape { public: Shape(){ cout << "Shape()" << endl; } virtual ~Shape(){ cout << "~Shape()" << endl; } virtual void fun(){ cout << "Shape::fun()" << endl; } }; class Rectangle : public Shape { public: Rectangle() { cout << "Rectangle()" << endl; fun(); i = new int; *i = 10; } ~Rectangle() { cout << "~Rectangle()" << endl; if (NULL != i) { delete i; i = NULL; } } void fun(){ cout << "Rectangle::fun()" << endl; } private: int *i; }; class Circle : public Shape { public: Circle() { cout << "Circle()" << endl; fun(); i = new int; *i = 20; } ~Circle() { cout << "~Circle()" << endl; if (NULL != i) { delete i; i = NULL; } } void fun(){ cout << "Circle::fun()" << endl; } private: int *i; }; int main(int argc, char *argv[]) { Shape *shape = new Rectangle; Shape *shape2 = new Circle; Rectangle *rect = dynamic_cast<Rectangle*>(shape); if (rect) cout << "shape is a rect" << endl; Circle *circle = dynamic_cast<Circle*>(shape); if (circle) cout << "shape is a circle" << endl; Rectangle *rect2 = dynamic_cast<Rectangle*>(shape2); if (rect2) cout << "shape2 is a rect" << endl; Circle *circle2 = dynamic_cast<Circle*>(shape2); if (circle2) cout << "shape2 is a circle" << endl; delete shape; shape = NULL; delete shape2; shape2 = NULL; return 0; }