CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

关于virtual ,这是什么原因? 大家讨论一下?

楼主holy198048(holy)2003-12-02 14:53:47 在 C/C++ / C++ 语言 提问

//////////////////////////////////////////////////////////////////////////////////////  
  //  
  //     FileName         :       test.cpp  
  //     Version           :       1.0  
  //     Creater           :        
  //     Date                 :       2003-12-2   11:51:50  
  //     Comment           :        
  //  
  //////////////////////////////////////////////////////////////////////////////////////  
   
  #include   <iostream>  
  /*#ifdef   _DEBUG  
  inline   void   *   _cdecl   operator   new   (unsigned   int   size,   const   char   *file,int   line)  
  {  
  };  
  inline   void   *_cdecl   operator   delete   (void   *p)  
  {  
  };  
  #endif   */  
  using   namespace   std;  
   
  class   A  
  {  
  public:  
           
          A()    
  {    
  ptra_   =   new   char[10];  
  }  
          virtual   ~A()    
  {    
  cout<<"A   destructor!";  
  foo();  
  delete[]   ptra_;  
  }                 //   非虚析构函数  
     
  void   bar()  
  {  
  foo();  
  }  
  private:  
          char   *   ptra_;  
  virtual   void   foo()  
  {  
  cout<<"   A::foo()!"<<endl;  
  }  
   
  };  
   
  class   B:   public   A  
  {  
  public:  
          B()    
  {    
  ptrb_   =   new   char[20];  
  }  
            int   Result   =   false;  
          int   nRetCode   =   false;  
   
   
   
  //Exit1:         //   sucess   exit  
   
          Result   =   true;  
   
  Exit0:             //   fail   exit  
   
          return   Result;  
      virtual   ~B()  
  {    
  cout<<"B   destructor!";  
  foo();  
  delete[]   ptrb_;  
  }    
  void   bar()  
  {  
  foo();  
  }  
  private:  
          char   *   ptrb_;  
  virtual     void   foo()  
  {  
  cout<<"   B::foo()!"<<endl;  
  }  
  };  
   
  void   main()  
  {  
  int   aSize,bSize;  
   
  aSize   =   sizeof(A);  
  bSize   =   sizeof(B);  
  cout   <<   "   aSize   =   "<<   aSize   <<   "   bSize   ="   <<   bSize   <<endl;  
          A   *   a   =   new   B;  
  a->bar();  
  aSize   =   sizeof(*a);  
  bSize   =   sizeof(a);  
  cout   <<   "   aSize   =   "<<   aSize   <<   "   bSize   ="   <<   bSize   <<endl;  
          delete   a;  
  }  
  析构函数使用了多态,一般普通函数是只会执行B的函数  
  为何析构都执行.好像是关于调用链的问题 问题点数:20、回复次数:6Top

1 楼hawkxjy(developer)回复于 2003-12-02 15:04:34 得分 5

楼主对继承对象的构造理解不够,子类对象构造时是先用基类构造函数构造一次然后用子类的构造函数构造一次,以保证变量的初始化;所以在析构时是先调用子类的析构一下,再用继类的析构一下,以保证所有动态创建的变量销毁。  
  所以析构函数都执行。Top

2 楼holy198048(holy)回复于 2003-12-03 10:12:12 得分 0

但是关于重载,基类中的函数和继承类之间好像不能够重载.  
  A   *a   =   new   B  
  A   *a   =   new   A  
  B   *b   =   new   B  
  之间有何区别?  
  还有>   我也知道在子类构造之前,会先构造基类,那为何大小还是原来的.Top

3 楼E17(守护星)回复于 2003-12-03 10:24:05 得分 5

什么叫   大小也是原来的  
    我看了一下   sizeof(A)   =   0x00000008   =   pvtable+   ptra  
                          sizeof(B)   =   0x0000000c   =   pvtable   +ptra   +ptrb  
   
   
  Top

4 楼byyyyy(苦行僧【苦】)回复于 2003-12-03 10:36:01 得分 5

先回答你:”但是关于重载,基类中的函数和继承类之间好像不能够重载.”问题  
  这里void   bar()  
  {  
  foo();  
  }  
  是隐藏。  
  隐藏的条件是:  
  派生类函数和基类函数名相同,参数也相同。但基类函数无virtual关键字。此时基类函数被隐藏。注意不要和覆盖混爻。因为覆盖是有关键字virtual的。  
   
  重载是在相同的范围。比如在同样一个类中。函数名相同,但是参数不通。通过判断参数的数目和顺序及类型,来达到同一个函数调用多个版本。  
   
  下面的问题,我还要想想。Top

5 楼byyyyy(苦行僧【苦】)回复于 2003-12-03 10:44:27 得分 5

A   *a   =   new   B  
  比如用此时定义的a去调用虚函数,那么将调用B中的虚函数。因为虚函数的访问控制并不取决于对象指针所指向的类,而且取决于调用虚函数对象指针所指的类。  
  A   *a   =   new   A  
  这个就没什么说法了,该怎么调用就怎么调用。  
  B   *b   =   new   B  
  同上Top

6 楼holy198048(holy)回复于 2003-12-04 09:33:44 得分 0

感谢大家,对于虚函数和继承现在清楚多了Top

相关问题

  • 讨论一下,virtual与dynamic的区别
  • 讨论一下::
  • 讨论一下
  • 讨论一下Session.
  • 讨论一下UpdateWindow().
  • 大家讨论一下NT 4.0 服务器当机有哪些原因,UP者有分!!
  • 讨论一下现在登录和发表文章都要附加码的原因和原理??
  • 讨论,关于VIRTUAL方法
  • 讨论一下 mpeg技术
  • 大家讨论一下window.close()

关键词

  • 函数
  • virtual
  • 调用
  • ptra
  • 虚函数
  • 基类
  • 参数
  • 相同
  • 隐藏
  • sizeof

得分解答快速导航

  • 帖主:holy198048
  • hawkxjy
  • E17
  • byyyyy
  • byyyyy

相关链接

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

广告也精彩

反馈

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