您的位置:首页 > 其它

虚析构函数

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: