读书人

请教c++高手一个关于虚析构函数的有关

发布时间: 2012-03-17 19:06:27 作者: rapoo

请问c++高手一个关于虚析构函数的问题用的是vc6.0
#include <iostream>
#include <string>
using namespace std;

class Point
{public:
Point(){}
~Point(){cout < < "executing Point destructor " < <endl;}
};

class Circle:public Point
{public:
Circle(){}
~Circle(){cout < < "executing Circle destructor " < <endl;}
private:
int radius;
};


int main()
{
Point *p = new Circle;
delete p;
return 0;
}


输出的结果是:execting Point destructor
为什么没有先调用派生类的析构,而是直接调用了基类的析构函数??
如果程序中~Point(){cout < < "executing Point destructor " < <endl;}将其声明为
virtual~Point(){cout < < "executing Point destructor " < <endl;}则会先调用派生类的析构函数然后调用基类的析构函数?是不是因为这里用到了new和delete的原因吗??
实在是不懂谢谢高手帮我解答了!



[解决办法]
为何需要虚析构函数?
当你可能通过基类指针删除派生类对象时
如果你打算允许其他人通过基类指针调用对象的析构函数(通过delete这样做是正常的),并且被析构的对象是有重要的析构函数的派生类的对象,就需要让基类的析构函数成为虚拟的。
[解决办法]
当没有加virtual的时候,因为在delete的时候,只会执行主体Point的析构函构函数;而virtual的作用就是在于,当基类指针指向派生类时候,可以按派生类的virtual类型函数执行;所以加了virtual以后就会先执行派生类析构,然后基类西沟。
[解决办法]
虚函数的作用。
动态查找,调用合适的函数

~Point()加virtual修饰,析构时会根据指向的具体对象,调用该对象的析构。
若没加,调用的就只是~Point()

读书人网 >C++

热点推荐