CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

有关虚函数的

楼主eion(那个谁)2001-12-30 10:07:29 在 C/C++ / C语言 提问

在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

相关问题

  • 有关于虚函数..
  • 请教各位高手有关虚函数和覆盖函数
  • 有关虚函数的问题。
  • 请教有关虚函数的问题。
  • 有关虚函数问题请教
  • 有关于函数....
  • 有关mail( )函数
  • 有关SAVEAS()函数
  • 虚函数?
  • 纯虚函数!

关键词

  • 函数
  • virtual
  • 析构
  • 派生
  • 类
  • aa
  • bb

得分解答快速导航

  • 帖主:eion
  • Linux2001
  • luckbird
  • hahaha88
  • alou
  • hz129

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo