有关虚函数的
在VC中自动生成类时老是来一个虚析够函数,如
class AA
{
AA();
virtual ~AA();
};
class BB
{
BB();
virtual ~BB();
};
请问在此virtual到底要干什么?有它没它的区别在哪?有它的好处在哪?
问题点数:20、回复次数:11Top
1 楼Linux2001(闭关开发中)回复于 2001-12-30 10:17:27 得分 3
在他的派生类中可以通过动态联编来保证正确的调用析构函数Top
2 楼luckbird(luckbird)回复于 2001-12-30 10:19:56 得分 4
这样就可以实现在派生类的时候自动执行相应得析构函数,因为有的类是在程序运行时自动产生的,在你不知道他会是什么样的类别以前,你可以用基类来表示它的类别,但在析构的时候它必须执行它自己的析构函数,这个不太好理解,我曾经看到过实例,有时间我在把实例给你看。Top
3 楼eion(那个谁)回复于 2001-12-30 10:22:42 得分 0
好像看懂了一点点,要理解嘛——可能还得一会儿Top
4 楼hahaha88(忧郁的眼神,稀嘘的胡子喳)回复于 2001-12-30 10:59:37 得分 2
好象Effective C++里有介绍的,嘻嘻Top
5 楼alou()回复于 2001-12-30 11:39:17 得分 1
在~AA和~BB加一些打印就知道了。Top
6 楼magicblue(小飞侠)回复于 2001-12-30 12:03:02 得分 0
你能保证他们不被继承吗?如果可以就不用虚析构Top
7 楼eion(那个谁)回复于 2001-12-30 12:32:39 得分 0
被继承时,难道派生类还可以定义~AA()或~BB()这样的成员函数吗?Top
8 楼hz129(古雨)回复于 2001-12-30 12:48:04 得分 10
#inlcude <iostream>
using namespace std;
class AA {
public:
AA() {}
virtual ~AA(){ cout << "~AA()" << endl; }
};
class BB : public AA {
public:
BB() {}
~BB() { cout << "~BB()" << endl; }
};
void main() {
AA a;
BB b;
}
运行一下上面的程序,注意有和没有virtual时的区别就知道为什么了。
派生类的析构函数调用时,如果基类析构函数是virtual的,则会自动调用基类的析构函数,这样可以保证对象被正确清除。Top
9 楼eion(那个谁)回复于 2001-12-30 13:48:14 得分 0
Sorry,还是有诸多不解之处
1)按上面的方式,该有谁被调用?为什么
2)如果采用
AA *pa;
BB *pb = new BB;
pa = pb;
delete pa;
输出结果还是~BB和~AA,为什么?(我开始以为~AA就不出现了呢)
Top
10 楼eion(那个谁)回复于 2001-12-30 13:57:24 得分 0
试出来了,如果采用
AA *pa;
BB *pb = new BB;
pa = pb;
delete pa;
则没有~AA()前没有virtual时只是输出
~AA()
但如果加上virtual后,输出为
~BB()
~AA()
thank everybodyTop
11 楼eion(那个谁)回复于 2002-03-05 12:47:06 得分 0
class AA
{
public: virtual ~AA(){cout<<"AA::~AA()\n";}
};
class BB: public AA
{
public: virtual ~BB(){cout<<"BB::~BB()\n";}
};
class CC: public BB
{
public: virtual ~CC(){cout<<"CC::~CC()\n";}
};
void main()
{
AA *pA=new AA;
AA *pB=new BB;
AA *pC=new CC; //注意这三个定义
cout<<"delete pA"<<endl;
delete pA;
cout<<"delete pA"<<endl;
delete pB;
cout<<"delete pA"<<endl;
delete pC;
}
结果为:
delete pA
AA::~AA()
delete pB
BB::~BB()
AA::~AA()
delete pC
CC::~CC()
BB::~BB()
AA::~AA()
如果你拿掉所有的vitual 结果为
delete pA
AA::~AA()
delete pB
AA::~AA()
delete pC
AA::~AA()
所以,虚析构函数是用来告诉你,该函数是可以用来被继承的,而且可以保证被继承德函数可以安全的被析构调(保证析构函数一定被运行);
如果没有virtual,那么该析构函数就有可能不能正确运行,Top




