5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

关于重载虚函数的问题!!!!

楼主jbmw(山涧清泉)2002-04-28 15:12:37 在 C/C++ / C语言 提问

我在重载一个基类的虚函数的时候,如果我没有重新定义函数的参数类型和参数个数  
  也没有修改函数的返回类,只是在函数中加了代码,这算不算重载  
  ????  
   
  BOOL   CTestDialog::OnInitDialog()      
  {    
  CDialog::OnInitDialog();    
  SetWindowText(m_strCaption);    
  …    
  return   TRUE;    
  }    
  例子如上 问题点数:20、回复次数:41Top

1 楼e_notimpl(e_notimpl)回复于 2002-04-28 15:18:59 得分 0

就是一行代码也不加,那也是重载。Top

2 楼jbmw(山涧清泉)回复于 2002-04-28 15:34:01 得分 0

up   againTop

3 楼gigix(透明)回复于 2002-04-28 15:35:20 得分 0

我做个实验先……Top

4 楼gigix(透明)回复于 2002-04-28 15:35:49 得分 0

再来……Top

5 楼gigix(透明)回复于 2002-04-28 15:37:02 得分 0

行了。对不起各位,我与此话题无关,我是来测试软件的。Top

6 楼dev_uoboy(【世界】)回复于 2002-04-28 15:49:38 得分 10

你那个叫继承,不叫重载。  
   
  重载的概念是拥有相同函数名,返回值不同(可选)参数不同(必须)的一组函数。编译器根据传递的参数来决定调用哪一个。  
   
  你说的“我没有重新定义函数的参数类型和参数个数  
  也没有修改函数的返回类,只是在函数中加了代码”这明显不是重载,这只是你继承了基类的虚函数而已。不能算重载!  
   
  OK?Top

7 楼jbmw(山涧清泉)回复于 2002-04-28 15:53:53 得分 0

然后重载对话框的虚成员函数OnInitDialog如下:    
  BOOL   CTestDialog::OnInitDialog()      
  {    
  CDialog::OnInitDialog();    
  SetWindowText(m_strCaption);    
  …    
  return   TRUE;    
  }    
   
  你可以看到他明显说的是重载对话框的虚成员函数,你又怎么解释  
  ???  
  而且具我所知,虚函数只能是重载,没听说继承的概念!!!  
  Top

8 楼freezingfire(让美梦来得更猛烈些吧)回复于 2002-04-28 16:55:41 得分 10

dev_uoboy(过程编程→面向对象):  
   
  看起来显然你的过程编程→面向对象还没完^_^  
  C++中一般来说,说起重载指的是两件事,第一,是你说的拥有相同函数名,返回值不同(可选)参数不同(必须)的一组函数。编译器根据传递的参数来决定调用哪一个。而另外一种,则就是在类继承的时候,在字类中重复实现父类的某个同名virtual函数。注意:不要重复实现父类的非viutual函数。  
   
  坦白的说,此处的名词翻译我觉得很不好,两个都叫重载,很容易混淆。顺便问一下,有人知道override和overload的区别么?和重载的这两种情况相对应么?谢谢。Top

9 楼prototype(原型)回复于 2002-04-28 17:20:04 得分 0

override   is   另外一种.   overload   is   第一.Top

10 楼sbg(宝宝酥)回复于 2002-04-28 17:30:28 得分 0

你那个叫多态,不叫重载。  
  重载的概念是拥有相同函数名,返回值不同(可选)参数不同(必须)的一组函数。编译器根据传递的参数来决定调用哪一个。  
  你说的“我没有重新定义函数的参数类型和参数个数  
  也没有修改函数的返回类,只是在函数中加了代码”这明显不是重载,这只是你继承了基类的虚函数而已。不能算重载!  
   
  Top

11 楼SphereEGO()回复于 2002-04-28 17:38:26 得分 0

楼上的兄弟  
   
  override   其实是覆盖的意思  
  class   Base   {   int   haha(){}   };  
  class   Child   :   public   Base   {   int   haha(){}   };  
   
  overload   就是我们平时说的重载了  
  class   Base   {   int   haha(){}   };  
  class   Child   :   public   Base   {   int   haha(int   haha){}   };  
   
  hope   i   am   rightTop

12 楼netxray(倦意的笑容)回复于 2002-04-28 17:57:08 得分 0

sphereego()好像错了  
  你的第二个例子是隐藏  
   
  如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)Top

13 楼netxray(倦意的笑容)回复于 2002-04-28 18:00:36 得分 0

tmd,第一个好像也错了  
  覆盖(override)应该在派生类中有vistual关键字Top

14 楼netxray(倦意的笑容)回复于 2002-04-28 18:04:06 得分 0

象高手请教!不知我的理解对否Top

15 楼dev_uoboy(【世界】)回复于 2002-04-28 20:15:50 得分 0

freezingfire(寻找我的爱人)   朋友感谢你的指正:)  
   
  不过我认为从基类过来的虚函数在派生类里不应该算重载吧?  
   
  重载的概念应该是针对于一个类作用于域才对吧。比如我有一个A类中有个Add()函数,在B类里也有这个函数,总不能说B类里的Add()是重载函数吧???  
  比如:  
  #include   "stdafx.h"  
   
  class   A  
  {  
  public:  
  void   ppp(){printf("class   A");}  
  };  
   
  class   B  
  {  
  public:  
  void   ppp(){printf("class   B");}  
  };  
   
  int   main(int   argc,   char*   argv[])  
  {  
  printf("Hello   World!\n");  
  A   a;  
  B   b;  
  a.ppp();  
  b.ppp();  
  return   0;  
  }  
  你不能说ppp是重载吧?所以我认为还是要在同一个类作用域里才能谈重载吧?  
   
  至于哪个到底叫什么,我认为sbg(宝宝酥)说的对,是叫多态,当时我打急了,自己也没想太多就打上去了。呵呵Top

16 楼papercrane(纸起重机)回复于 2002-04-28 21:31:27 得分 0

class   A;  
  class   B   :   public   A{};这可以算inheritate(继承),B   is   derived(派生)   from   A。  
  class   A{   void   a(){}};   class   B   :   public   A{void   a(XXX){});,无论B::a的参数是什么,都可以称为overload(不译了,免得混淆)。  
  class   A{   virtual   void   a(){}};   class   B   :   public   A{void   a(int){}};,这还是overload。如果在Delphi里面,还要加上关键字说明必要性,以免得不到polymorphism(多态)的结果。  
  class   A{   virtual   void   a(){}};   class   B   :   public   A{void   a(){}};,这可算是override了。  
  欢迎指教。Top

17 楼prototype(原型)回复于 2002-04-29 05:47:30 得分 0

hope   the   following   examples   may   clarifies   something   (rather   than   mixing   things   up   :-).  
   
  1.   overload  
   
  void   a(   int   );  
  void   a(   float   );  
  void   a(   char   );  
   
   
  2.   override  
   
  struct   A  
  {  
        virtual   void   a(   int   );  
  };  
   
  struct   B   :   public   A  
  {  
        virtual   void   a(   int   );  
  };  
   
   
  3.   hide  
   
  struct   A  
  {  
        void   a(   int   );  
  };  
   
  struct   B   :public   A  
  {  
        void   a(   int   );  
  };Top

18 楼prototype(原型)回复于 2002-04-29 05:48:55 得分 0

don't   know   how   to   discriminate   them   in   chinese.   :(Top

19 楼Betta(小新)回复于 2002-04-29 09:34:29 得分 0

prototype(原型)   说得很明白了  
   
  {2,   3}   情况在调用的时候,写上类名可以explicit指定调用那个函数,  
   
  B   oB   ;  
  ...  
  oB.B::a(10)   ;   //   equal   with   oB.a(10)  
  oB.A::a(10)   ;Top

20 楼freezingfire(让美梦来得更猛烈些吧)回复于 2002-04-29 10:01:11 得分 0

我们国家的有些计算机名词翻译的真是...唉。Top

21 楼jbmw(山涧清泉)回复于 2002-04-29 10:33:38 得分 0

我也觉得应该是语言翻译的问题  
  我讲的那种情况不能算是重载。  
  应该叫覆盖比较合适。  
  我刚刚看了Effective   C++这本书  
  他对重载讲的很详细,所以我才对上面说的重载这种情况产生了怀疑。  
  看样子都是我们某些写书的人不够严谨。Top

22 楼reven_zl(速度还是容量)回复于 2002-04-29 11:53:44 得分 0

这个不叫重载,因为你的父类和子类中的函数的参数个数和类型都一样,这种情况叫覆盖,在《C++大学教程》中翻译为重定义。  
  重载必须是函数的参数个数或类型都不一样,重载可以发生在同一个类中,也可以在子类中重载基类的函数  
  虚函数是通过重定义实现的,而不是重载Top

23 楼zoukh(无名)回复于 2002-04-29 14:56:33 得分 0

1.   overload:   When   two   or   more   declarations   are   specified   for   a   single   name   in   the   same   scope,   the   name   is   said   to   be   overloaded.  
   
  thus,  
  class   a   {  
    void   f();  
    void   f(int);  
  };  
  f   is   overloaded.  
   
  2.   When   the   names   are   in   different   scope,   the   case   is   called   hide.  
    int   i;  
  {  
    int   i;    
  }  
   
  and:  
   
  class   a   {  
    void   f();  
  };  
   
  class   b   :   public   a  
  {  
    void   f();   //   hide   a::f  
    void   f(int);   //   hide   a::f  
  };  
   
  3.   override:   when   a   derived   declare   a   function   with   the   same   signature   as   a   virtual   function   in   the   base:  
  class   a   {  
    virtual   void   f();  
    virtual   void   f2();  
  };  
  class   b   :   public   a  
  {  
    virtual   void   f();   //   override   a::f()  
    void   f2();   //   override   a::f2().   virtual   is   not   necessary   here  
  };  
   
  Top

24 楼xuning80(Ken)回复于 2002-04-29 15:02:07 得分 0

我怎么觉得重载=override,过载=overloadTop

25 楼xuning80(Ken)回复于 2002-04-29 15:05:18 得分 0

“重”就有覆盖的意思吧,而"过"则表示有多种prototypeTop

26 楼xuning80(Ken)回复于 2002-04-29 15:10:46 得分 0

另外还有的,就是hide了,感觉是,总共也就三种形式,名字就随便叫了Top

27 楼steedhorse(晨星)回复于 2002-04-29 15:13:52 得分 0

重载重载。Top

28 楼SphereEGO()回复于 2002-04-29 17:37:58 得分 0

有收获Top

29 楼diaopeng(放飞自己)回复于 2002-04-29 21:58:53 得分 0

是虚函数重载,不是一般函数重载,虚函数重载不允许修改返回类型,参数和函数名等,但函数体可以不一样Top

30 楼diaopeng(放飞自己)回复于 2002-04-29 22:07:25 得分 0

dev_uoboy(过程编程→面向对象),你还没有理解什么叫重载与继承吧,误导大众,虚函数重载不能改变其返回类型,参数和函数名等,否则就是一般函数重载,失去了虚特性,一般重载就如你所说的那样,回去再好好看看C++的书吧Top

31 楼netxray(倦意的笑容)回复于 2002-04-30 09:12:45 得分 0

其实我说的是对的,可惜高手还没来Top

32 楼Betta(小新)回复于 2002-04-30 14:44:48 得分 0

to   netxray(灯下骷髅谁一剑):  
   
  你是对的,   证据参见   prototype(原型)   的言论  
   
  a.   overload   对于同一个namespace   来说  
  b.   hide   对于继承关系的   class   来说  
  c.   overrid   是对继承关系的动态绑定   (virtual)   来说的  
   
  坚持以上三点先  
   
  -------------------------  
  由于   C++   有   using   这个关键词,可以将继承关系的成员   import   到同  
  一个   namespace,   也就是将hide   变成   overload   的情况,示例代码:  
   
  #include   <iostream>  
   
  class   CParent  
  {  
  public:  
      void   DoSome()  
      {  
          std::cout   <<   "CParent::DoSome()"   <<   std::endl   ;  
      }  
  }   ;  
   
  class   CChild  
  :   public   CParent  
  {  
  public:  
      using   CParent::DoSome   ;   //   if   you   omit   this,   lead   to   compile   failure  
      void   DoSome(int   nVal)  
      {  
          std::cout   <<   "CParent::DoSome("   <<   nVal   <<   ")"   <<   std::endl   ;  
      }  
  }   ;  
   
  int   main()  
  {  
      CChild   oSome   ;  
      oSome.DoSome()   ;  
      oSome.DoSome(10)   ;  
      return   0   ;  
  }  
  Top

33 楼Betta(小新)回复于 2002-04-30 14:49:40 得分 0

看了一下,zoukh(无名)   的总结比较全面详细一点  
  不错,大家要铭记在心哦Top

34 楼ss_syxh(小麦)回复于 2002-04-30 15:21:28 得分 0

我比较同意   sbg(宝宝酥)   的关点.Top

35 楼Betta(小新)回复于 2002-04-30 15:31:05 得分 0

sbg(宝宝酥)引入了   多态  
   
  估计他不清楚什么是多态,  
  多态在面向对象中可以这样定义:一个行为在不同context下有多个解释  
   
  所以在这个问题上,overload,   hide,   overrid   都可以称多态  
   
  而在   C   语言中,很难出现这个词,其实是因为缺乏   namespace/class   的概念Top

36 楼hz129(古雨)回复于 2002-04-30 15:40:38 得分 0

diaopeng(遥远)  
   
  dev_uoboy(过程编程→面向对象),你还没有理解什么叫重载与继承吧,误导大众,虚函数重载不能改变其返回类型,参数和函数名等,否则就是一般函数重载,失去了虚特性,一般重载就如你所说的那样,回去再好好看看C++的书吧  
   
  虚函数支持返回类型的协变(好象是这样翻译的吧),比如:  
  class   A   {  
      public   virtual   A   func()   {...}  
  }  
  class   B   :   public   A   {  
      public   B   func()   {...}  
  }  
  是完全可以的,是C++支持多态的新特性之一。Top

37 楼Betta(小新)回复于 2002-04-30 15:49:49 得分 0

to   hz129(古雨),  
      你的例子比较特殊啦,应该不能编译的,应该该用引用类型或指针的  
      还有不要象Java那样写   public  
   
  class   A  
  {  
  public:  
    virtual   A   &   func()   {...}  
  }   ;  
  class   B  
  :   public   A  
  {  
  public:  
    virtual   B   &   func()   {...}  
  }  
  Top

38 楼SphereEGO()回复于 2002-05-01 21:05:49 得分 0

to     netxray(灯下骷髅谁一剑)   :  
  哈哈不好意思,我的确是理解错了。  
  改正改正:)Top

39 楼dev_uoboy(【世界】)回复于 2002-05-03 13:53:28 得分 0

hz129(古雨)  
    你连最简单的C++语法都没搞清楚,有资格叫我去重新看书?我看你先搞懂C++的语法再说吧……,看看是你在误导大众还是我???  
   
  C++中可以这样写么:  
  class   A   {  
      public   virtual   A   func()   {...}  
  }  
  class   B   :   public   A   {  
      public   B   func()   {...}  
  }  
   
  JAVA和C++比还有有本质上的差别的!!!  
   
  你学好C++在来吧,不要用JAVA的东西来解释C++的概念!!!Top

40 楼hz129(古雨)回复于 2002-05-15 14:24:52 得分 0

呵呵,最近在看C#,语法都写混了,真是不好意思,不过Betta(小新)说得对,是应该返回引用或指针才行。Top

相关问题

  • ■虚函数、函数重载与静态函数问题
  • 函数重载
  • 函数重载?
  • 虚函数的重载问题
  • 虚函数 重载 覆盖 的问题。
  • 请教:C++中重载与虚函数关系!
  • MFC中虚函数重载后出现了问题?
  • 虚拟函数和重载的题目,不懂啊!!!!!!!!!
  • 有没有办法限制虚函数可重载的层数?
  • 如何让派生类必须重载一个虚函数

关键词

  • c++
  • 函数
  • 编译器
  • virtual
  • 翻译
  • 代码
  • 修改
  • 重载
  • 参数
  • 虚函数

得分解答快速导航

  • 帖主:jbmw
  • dev_uoboy
  • freezingfire

相关链接

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

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问