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

C++的多态性与重载好像作用差不多,谁能讲讲啊?

楼主dynamic_pump(阿辉)2002-01-20 11:01:10 在 C/C++ / C语言 提问

问题点数:20、回复次数:68Top

1 楼7680(周周)回复于 2002-01-20 11:11:04 得分 5

不同,多态是用于不同类,重载是用于同类,多态函数名,参数类型,多少,顺序是相同的  
  重载中函数名相同,但参数类型,顺序,个数至少要一个不同Top

2 楼eastsun()回复于 2002-01-20 12:14:35 得分 0

差远了。  
  多态性,简单地说,就是你是大学生,你也是学生,明白了吗?  
  重载就是给你某个复杂的动作取个大家都熟悉的名称。吾兄儿时,要吃饭时,曰“驮”,于是吾父母予之食,“驮”者——“食”字用于吾兄的重载功能也。Top

3 楼maoxianwang(傻蛋)回复于 2002-01-20 13:59:44 得分 0

多态性主要表现在1:重载  
   
                                  2:虚函数(还是重载)  
   
  重载是方法,多态是表现,你明白了没有!  
   
  就是重载和多态的变正关系,其实不重要啊Top

4 楼wqn_yz(呆呆)回复于 2002-01-20 15:31:57 得分 0

多态的意思是从语言特别性上来说的,主要是指类的客户(使用者)可以用基类的指针来操作以这个类做基类的整个类体系——前提是这个类实现了虚函数,而重载则是多态的实现上的方法——调用者能根据实际的对象调用这个对象的所处类层次上的虚函数——来完成多态  
  实现虚函数要求返回值和参数完全相同Top

5 楼wangyong312(wy)回复于 2002-01-20 17:18:35 得分 0

可以说,多态是重载的一种特例!!!  
   
  多态实现是由虚函数来实现的  
  多态是由于子类继承父类时,子类的成员函数为了完成功能上的扩展,把父类的相应的成员函数  
  设置为虚函数(virtual),以使程序实现迟后联编。  
  Top

6 楼hotage(路漫漫)回复于 2002-01-20 17:35:14 得分 0

同意wangyong312Top

7 楼dynamic_pump(阿辉)回复于 2002-01-20 20:15:48 得分 0

哪个说得对,好像大家意见不统一啊,不过我   同意周周的那一种,大家说对吗?Top

8 楼TrembleTree(TrembleTree)回复于 2002-01-20 21:52:53 得分 10

#include   <iostream.h>  
  #include   <stdio.h>  
   
  class   ClassA  
  {  
  public:  
  void   func1()   {   cout   <<   "This   is   ClassA::func1()"   <<   endl;   }  
  void   func2()   {   cout   <<   "This   is   ClassA::func2()"   <<   endl;   }  
  virtual   void   vfunc1()   {   cout   <<   "This   is   ClassA::vfunc1()"   <<   endl;   }  
  virtual   void   vfunc2()   {   cout   <<   "This   is   ClassA::vfunc2()"   <<   endl;   }  
  };  
   
  class   ClassB   :   public   ClassA  
  {  
  public:  
  void   func2()   {   cout   <<   "This   is   ClassB::func2()"   <<   endl;   }  
  virtual   void   vfunc2()   {   cout   <<   "This   is   ClassB::vfunc2()"   <<   endl;   }  
  };  
   
  void   main()  
  {  
                    ClassB   b;  
   
                    b.func1();  
                    b.func2();  
                    b.vfunc1();  
                    b.vfunc2();  
   
                    ClassA   pA   =   &b;  
   
                    pA->func1();  
                    pA->func2();  
                    pA->vfunc1();  
                    pA->vfunc2();  
  }  
   
  结果:  
  This   is   ClassA::func1()       //继承  
  This   is   ClassB::func2()       //func2()是用范围重载  
  This   is   ClassA::vfunc1()  
  This   is   ClassB::vfunc2()  
   
  This   is   ClassA::func1()  
  This   is   ClassA::func2()       //重载的函数没有多态性  
  This   is   ClassA::vfunc1()  
  This   is   ClassB::vfunc2()     //虚函数有多态性  
   
  利用多态性,就可以使用基类指针完成一个派生系中所有类的某些一般性操作,比如做一个循环.它会在运行时根据指针所指对象的实际类型来决定调用哪个函数,而不是根据指针类型.利于简化程序以及程序的扩展。  
  虚函数是不是重载的特例呢?我也不太清楚,感觉不是。每个对象的虚函数表中都明确定义了每一个虚函数:改写过的就是指向本类的,没改写的就是指向基类的。而成员函数如果没有被重载,那么在这个对象的内存区域中没有体现,而是在父类的内存区域中体现。Top

9 楼TrembleTree(TrembleTree)回复于 2002-01-20 22:06:05 得分 0

对不起.更正一下:ClassA*   pA   =   &b;Top

10 楼snewxf(心疤)回复于 2002-01-21 00:26:17 得分 0

同意类上兄台的话。  
  这是想不通为什么PA->FUN2();为什么会得到。This   is   ClassA::func2()      
  TrembleTree(TrembleTree)能否祥细的解释一下。谢谢  
  Top

11 楼qqchen79(知秋一叶)回复于 2002-01-21 06:15:26 得分 5

多态是运行时(根据vptr->vtable)动态解析的,重载是编译期间静态解析(根据调用点的参数类型/数目)的,大大的不同!Top

12 楼mul()回复于 2002-01-21 12:02:00 得分 0

本质上的不同  
  同意qqchen79(知秋一叶)   
  参看<<C++编程思想>>  
  Top

13 楼tianzhhy(天之痕)回复于 2002-01-21 14:04:39 得分 0

多态:通过继承而有关的不同的类,他们的对象能够对同一个函数调用作出不同的相应。是通过许函数实现的。当通过指向派生类对象的基类指针调用虚函数时,c++会在于对象关联的派生类中选择重定义的函数。  
  函数重载:在同一个类中,c++允许用同一个名字定义函数,但参数类型,顺序,个数至少要一个不同。不能只有返回类型不同。它通常是建立在不同数据类型,但完成类似的任务时。Top

14 楼tianzhhy(天之痕)回复于 2002-01-21 14:09:14 得分 0

我觉得多态不是重载特例。  
  因为多态要求函数名,参数类型,多少,顺序是相同的。  
  而重载却要求参数类型、个数、顺序至少有一个不同,返回类型也可以不同。Top

15 楼tianzhhy(天之痕)回复于 2002-01-21 14:27:01 得分 0

PA->FUN2();会得到。This   is   ClassA::func2()    
  我觉得因为ClassA中func2()   不是虚函数,因此不能实现动态连编,所以根据指针类型调用。  
  不知对不对。  
  Top

16 楼halfdream(哈欠)回复于 2002-01-21 15:27:23 得分 0

好象是因为在重载的概念上有点不统一,这是个从英语词翻译过的东西,我也  
  发现很多c++资料和教材上都有些混乱。  
  这儿有两个东西    
  override,  
  overload.  
  另外,它们在DELPHI的OBJECT   PASCAL语法中很清楚。  
  在C++中则容易混淆。。我现在就有点昏。发贴和回贴的说的都谁是谁呢?  
   
   
   
   
   
  Top

17 楼TrembleTree(TrembleTree)回复于 2002-01-21 15:43:33 得分 0

同意qqchen79的。  
  虚函数是运行期绑定(晚绑定),而重载是编译期绑定(早绑定)。因此,虚函数的调用会依据对象的实际类型,这就提供了多态性。重载其实是在应用程序的空间内提供了一种重名的机制,其实重载的函数,尽管它们的函数名相同,但是它们本质上是不同的函数,因为函数地址不同。  
   
  再深入我就不懂了,我也是菜鸟。:)Top

18 楼heroux(FlyerAero)回复于 2002-01-21 16:13:12 得分 0

多态与重载相同点是函数名相同,不同点是多态表现为动态联编,既同一个函数根据运行时参数的类型不同,生成虚函数调用的的指针表,调用不同的虚函数。而重载在编译的时候,参数的数据类型已经确定了,灵活性上不如多态的虚函数。Top

19 楼heroux(FlyerAero)回复于 2002-01-21 16:29:36 得分 0

多态与重载相同点是函数名相同,不同点是多态表现为动态联编,既同一个函数根据运行时参数的类型不同,生成虚函数调用的的指针表,调用不同的虚函数。而重载在编译的时候,参数的数据类型已经确定了,灵活性上不如多态的虚函数.你可以看看vc的MFC头文件,很多都有了虚函数.Top

20 楼lsxredrain(老牛)回复于 2002-01-21 18:54:01 得分 0

上面的代码有点小错误  
  ClassA   pA   =   &b;  
    应改为  
  ClassA   *A   =   &b;  
   
   
  Top

21 楼wlsoft()回复于 2002-01-21 20:26:26 得分 0

如果作为独立的类(string类),就用重载函数。如果作为base   class,还是要考虑用虚拟函数。   Top

22 楼bjhz(我走我路)回复于 2002-01-22 08:14:32 得分 0

你们多数人好象都把一个概念弄混淆了。  
   
  1.   多态是OO概念中的一个非常重要的概念,但,多态和虚函数不是一回事。象什么动态联编,什么用基类指针,这些都指虚函数。  
   
  2.   重载是在C++中实现多态的一个方法,另外一个方法就是虚函数。“多态是重载的一个特例”之类的说法不知道是哪里学来的。  
  Top

23 楼wyzh(wyzh)回复于 2002-01-22 08:51:13 得分 0

我感觉多态性就是由重载实现的。Top

24 楼bjhz(我走我路)回复于 2002-01-22 11:12:18 得分 0

最好先弄清到底什么叫多态。  
  多态是一个概念,实现这个特性的方法有很多中,有些是C++直接提供的,(虚函数是其中的一种),还有些方法是自己写代码实现的。重载只是众多方法之一。Top

25 楼bjhz(我走我路)回复于 2002-01-22 11:13:33 得分 0

你可以看看《设计模式》中实现多态的方法。Top

26 楼dynamic_pump(阿辉)回复于 2002-01-22 11:46:27 得分 0

bjhz(我走我路) 我看C++的书上说多态性是由虚函数来实现的好像没有说由重载来实现啊,我看的是张松梅的《C++语言教程》电子科技大学出版的。Top

27 楼gmc007(江西的佬表)回复于 2002-01-22 13:15:45 得分 0

讨论得很精彩!  
  但到底谁的或者哪些人的才是对的呢?!  
  哪位兄弟来个总结性发言好吗?Top

28 楼devouer(玩笑一生)回复于 2002-01-22 13:26:13 得分 0

多态是用虚函数来体现的,就象在COM中的定义与实现分离,它之所以用虚函数的目的就是为了实现多态。多态的意思就是定义是清楚的,但是实现是不同的。  
  而重载的意思就是得到其定义,但需要重新实现.  
  另外在界限上也不一样,多态是指在同一父类的各子类间有同一种定义但有不同实现,而重载指在一个类的同一定义但有多种实现。Top

29 楼kissfire(kissfire)回复于 2002-01-22 14:49:36 得分 0

收藏!Top

30 楼vbstudent(只看不说)回复于 2002-01-22 15:41:54 得分 0

做个记号!Top

31 楼bjhz(我走我路)回复于 2002-01-22 16:11:06 得分 0

多态性和虚函数不是必然的联系,  
  只不过虚函数是c++中专门用来支持多态的方法。  
  实现多态不只这一个方法,  
  即使你不用c++,只用c也可以实现多态,  
  只不过做起来复杂一些,  
  因为c没有提供专门的机制来实现多态。  
  就象c语言中没有提供std::Vector这样的动态数组,  
  但你也可以自己写一个动态数组。  
  不要把多态和虚函数混为一谈。Top

32 楼bjhz(我走我路)回复于 2002-01-22 16:16:59 得分 0

还有,重载函数其实不是真正的多态,  
  它只是一中表象的,  
  因为,在编译时编译器就可以确定具体要调用的版本。  
  而用虚函数实现的多态在编译是编译器是无法知道具体调用哪个版本的。  
  只有运行的时候才能确定。Top

33 楼wangyanjiangjjj(广灵)回复于 2002-01-22 16:46:54 得分 0

正如halfdream(哈欠)所言,“重载”二字其实有两层含义,即“Override"   和"overload",中国人都翻译成重载,所以造成混乱。        Top

34 楼xiaodeshi(肖德时)回复于 2002-01-22 18:10:06 得分 0

多态性是指一个接口,多种实现的概念。  
  重载是指Override并overload的概念。  
  Top

35 楼hope_ma(hope)回复于 2002-01-22 18:43:01 得分 0

我个人认为:多态是相对于对象而言的,而重载是相对于函数而言的。Top

36 楼deadrock(在中央精神病院做研究工作)回复于 2002-01-22 19:18:01 得分 0

多态是相对于虚函数而言的,而重载则是对于同一个类中的同名函数Top

37 楼Nicrosoft(奈软)回复于 2002-01-22 20:30:56 得分 0

  这里有一个初学者经常混淆的概念。覆盖(override)和重载(overload)。上面说了,覆盖是指子类重新定义父类的虚函数的做法。而重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。其实,重载的概念并不属于“面向对象编程”,   重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function   func(p:integer):integer;   和function   func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!  
   
    引用一句Bruce   Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。”  
   
   
  以上摘自《浅谈多态——概念描述》  
  http://www.sunistudio.com/nicrosoft/art7.htmTop

38 楼nibani(泥巴泥)回复于 2002-01-22 22:37:39 得分 0

nod   Nicrosoft(奈软)(生活就是折腾) Top

39 楼do_do(do_do)回复于 2002-01-23 04:46:22 得分 0

Nicrosoft   brought   another   very   good   but   confusing   point,   that   is   polymorphism   and   dynamic   binding.   Dynamic   binding   is   one   way   (the   C++   way)   to   implement   polymorphism.   However,   it   is   not   the   only   way   to   implement   it.   The   "Object-Oriented   Software   Engineering:   A   Use   Case   Driven   Approach"   by   Ivar   Jacobson   has   a   session   talking   about   it.  
   
  “不要犯傻,如果它不是晚邦定,它就不是多态。”   is   WRONG   except   "不要犯傻"!  
  There   are   something   called   "compile-time   polymorphism"   and   "runtime-polymorphism".   Templates   and   function   overloading   (in   C++)   is   "compile-time   polymorphism".   Function   overriding   (virtual   function   in   C++)   is   "runtime-polymorphism".   Looks   like   there   is   no   "compile-time   polymorphism"   for   Bruce.  
   
  This   is   good   OO   topic.   Let's   take   an   example   to   see   if   you   agree   to   that   function   overloading   is   a   form   of   polymorphism(I   don't   think   there   is   a   disagreement   on   templates   are   polymorphism).   When   a   person   given   a   food   to   eat,   the   person   will   eat   it   differently   based   on   what   the   food   is.   Peal   then   eat   it   if   it   is   a   banana   or   orange   etc.   Use   spoon/fork/chopstick   for   whatever   is   proper.   Basically,   it   is   different   behavior   according   to   whatever   he/she   receives.   Though,   there   are   people   arguing   abouth   it,   I   personally   believe   it   is   a   form   of   polymorphism.  
   
  Top

40 楼do_do(do_do)回复于 2002-01-23 04:53:20 得分 0

BTW,   many   people   get   over-emphasized   on   /virtual   function/dynamic   binding   as   a   form   of   polymorphism   in   C++   therefor   ignored   or   do   not   pay   enough   attention   of   what   the   other   polymorphism   mechanisms   are.  
   
  If   you   don't   like   "compile-time   polymorphism",   think   about   inline   virtual   function.   How   it   works   with/without   polymorphism.Top

41 楼lians(c++, I like it)回复于 2002-01-23 09:12:51 得分 0

C++的多态分编译时多态和运行时多态  
   
  编译时多态:重载  
  运行时多态:虚函数Top

42 楼gmc007(江西的佬表)回复于 2002-01-23 13:08:21 得分 0

: do_do(do_do)   
  你说得很经典,但我有许多关键的地方都看不懂!  
  这位大哥,你说国语好不好?  
  难道一定要用E文才能表达得清楚"多态"和"重载"吗?Top

43 楼bibleboy(水壶阳台)回复于 2002-01-23 20:00:40 得分 0

 
  拿“泡”mm和“泡”澡   来说:  
  多态:“泡”mm和“泡”澡都是“泡”。不管泡什么,先“泡”了再说(晚绑定)  
  重载overloading:同一个类中的方法,参数表,返回类型可不同。传一个mm过来“泡”,传2个mm过来照样有方法“泡”。  
  覆盖overriding:老爸“泡”老妈,我“泡”我女朋友,有继承关系,参数返回值都必须一样,但手法已经不一样了。  
   
  重载和多态没什么关系,多态是和覆盖有关系。Top

44 楼do_do(do_do)回复于 2002-01-24 00:14:35 得分 0

: gmc007(江西的佬表)  
  对不起,我的电脑环境是英文的(但装有中文输入软件)而且我中文输入很慢,再加上许多电脑词汇的中译我不知道,所以我常常用英文。  
  Top

45 楼wzheng()回复于 2002-01-24 10:42:03 得分 0

通过重载来实现多态性。  
  如你多次重载某个函数。  
  这个函数在不同的类中使用效果是不同的。即多态性Top

46 楼wyzh(wyzh)回复于 2002-01-24 12:46:34 得分 0

太精采了。Top

47 楼mage_ningxia(不听话)回复于 2002-01-24 15:06:54 得分 0

多态性是重载的思想的高度升华!Top

48 楼alula(alula)回复于 2002-01-24 16:12:09 得分 0

to   do_do:  
  “不要犯傻,如果它不是晚邦定,它就不是多态。”   is   WRONG   except   "不要犯傻"!  
  我的看法。  
  我觉得要说"compile-time   polymorphism"是否是polymorphism,  
  需要究根提出polymorphism这个概念的历史目的,polymorphism   是为了达到什么样的目的、解决什么问题而产生的,   而  
  "compile-time   polymorphism"   是否也达到这个目的了?(我还不知道)  
   
  或许   "compile-time   polymorphism"   可以说是多态,但这种说法只是对polymophism的一种引申、拓展,已经不再是原来的含义了。  
   
  只是猜测,bruceeckel   的说法是严肃的正统的polymorphism,可能"compile-time   polymorphism"只是一种引申。  
   
  在技术实现上,"compile-time   polymorphism"   和   "run-time   polymorphism"是两种完全不同的处理方式。对于前者,只要是苹果,就只有固定工具的处理方式用在它身上。而对于后者,一个苹果,可以用更有弹性的选择处理方式。  
  另外疑问:  
   
  你拓宽了我的想法。呵呵呵Top

49 楼magicblue(小飞侠)回复于 2002-01-24 21:29:17 得分 0

do_do的看法在一般书里找不到~~  
   
  我觉得在这点上仁者见仁智者见智,有些人就是不认为重载是一种多态,也不能说他错了。观念问题。  
   
  “最佳的系统在于你的需要,包括现在和将来。”Top

50 楼maguey_n(莫寒忆)回复于 2002-01-24 23:06:52 得分 0

c++中的重载是多态性的一种,多态性可以分为静态多态性和动态多态性,其中,静态多态性的表现形式就是重载,而动态多态性是通过虚函数来实现的。  
  静态多态性就是载编译的时候确定调用哪一个函数,所以,重载的函数一定要有参数的不同。  
  而虚函数是在运行的时候,通过基类指针指向派生类和虚函数表来实现的。而且,虚函数的函数名和参数一定要相同。Top

51 楼do_do(do_do)回复于 2002-01-25 01:38:56 得分 0

To:   alula  
  你好象反过来了。跳出C++才能较完整地看多态。  
  maguey_n(夕雨淋)总结得很好。  
   
  To:   magicblue(小飞侠)  
  许多著名的C++书上都可以找到“compile-time   polymorphism"你只要查一下它的index就可以找到。我不知道你说的“一般书”是哪些书。但“The   C++   Programming   Language"里有好几处谈到它。我说过The   "Object-Oriented   Software   Engineering:   A   Use   Case   Driven   Approach"   by   Ivar   Jacobson有一节讨论相关议题(对不起,我把section打成session了。看来我的英文/打字也有待改进^_^)。我想这两本书应该是在OO和C++精进过程中的多数人都看的吧。  
   
  用C++学OO是不太好的(我认为SmallTalk较好)。但用它来实现OO很不错。这就是为什么,很多人用C++但不一定有那么多的人在用OO。我(在美国)碰到过不少C++语法/句法非常精但OO非常差的人。我也碰到些OO很好但C++极差以及C++和OO都非常好的人。比较之下很受用。  
   
  学/用C++不学/用OO有如用电钻当锤子,可用但更容易砸烂手指和电钻(谁说的来着?)。Top

52 楼greensleeve(绿袖子)回复于 2002-01-25 02:52:58 得分 0

To   do_do(do_do)  
  有点想法和你相同,有很多人好象把多态与虚函数或重载函数搞混了,多态应该是OO思想中的一部分,是人类对客观世界的一种抽象,比方说,我们要描述一部轿车(CAR),那么这部车即可被看做轿车(CAR),也可以被看做是车辆(VEHICLE),从OO述语来说,一个对象即是属于该对象类的一个实例,也是属于该对象类的众多基类的一个实例,这样我们可称为多态。但在实际情况中,某一个具体时刻,一个对象的状态是确定的,我们再以上面的例子,假设这样有这样一个类的继存关系(不是很严格,只是为了说明方便),  
  vehicle   ---   truck   ---   car  
  以上的继存关系中严格来说car不应是truck的子类,这里之所以这样只是为了说明方便。  
  现在的情况是我们得到一个对象,我们只知道它是一个车辆(vehicle),但不知它到底是truck还是car,但我们知道这三个类都有一个方法叫做“鸣笛”,我们也知道truck和car的鸣笛声是不一样的,于是我们就求助这个方法,邮于这个对象的状态是确定的,要么是truck,要么是car,(我们刚刚才说的,一个对象即是vehicle又是car,这是从逻辑关系上对客观事务的一种描述,实际情况是一个对象只能是某一具体类的实例),接下来,当我们求助这个方法时,就可以知道这个vehicle到底是truck还是car了。  
   
   下面谈谈虚函数,我们知道所有的程序设计语言都是用来表述客观事务或其关系的,那么要表述上面这样的事实,第一,我们要能描述每个对象的特性,在C++中就是用类了,用类来抽象出每一类对象专有的特性(比方说车辆区别于动物的特性),第二,我们要能描述出事务之间的关系,就象轿车是车,卡车也是车(以前好象学过哪个哲学大师的什么:白马非马,不知是怎么回事,一直没闹懂),同样在C++中可以用类的继存来描述这种关系,使不同的类具有父子关系,第三,我们要能够在某一具体是刻(比方说程序运行到某一点)能够辨别某一个对象到底是属于哪个类的,(一个车辆到底是卡车还是骄车),这时说要求我们用的编程语言能够在运行时保存某个对象的类的信息,用MFC的宏RUNTIME——CLASS()可以得到一个有关运行时类信息的结构,根据这个信息就可以确定此对象到底是属于哪一类的。对于上面的例子,每一种车辆都有“鸣笛”这一方法,但每一具体车辆对这一方法的实现是不一样的,在程序设计上,我们可以为每一种车辆设计一个鸣笛的方法,比方说,为truck的鸣笛方法取名叫GG(),为car的取名叫MM(),当要鸣笛时,我们根据不同的对象分别调用GG或MM,但问题是有时候我们根本不可能知道这个对象到底是什么,就好象我们座在驾使室里,眼睛被蒙上了,我们不知道坐在什么车上,我们只知道可以按那吧可以让车鸣笛,这时我们就要知道那吧的位置,如果我们为每一种车辆的鸣笛方法都取一个不同的名字,这就好象不同的车辆的那吧的位置不一样(象是这种情况,卡车的那巴按钮安在车轮上,而轿车的按钮安在车屁股后面)这种情况我们怎么办?所以C++引入了虚函数,用同一个函数名,相同个数与类型的参数来实现不同的功能。这说好比所有车的那巴在一个位置。  
   
   
  累死了,打的字太多了,希望对大家有点帮助。有不同意见可继续讨论。  
  my   QQ   :12691399Top

53 楼pploveshao(Waterfall)回复于 2002-01-25 09:58:20 得分 0

应该是只有子类覆盖了父类VIRTUAL   FUNCTION才会出现多态这种效果吧,在C++中如果子类覆盖了父类的一个NONE   VIRTUAL   FUNCTION,那结果还是不会搞出运行期绑定这种效果的。在JAVA中似乎所有的方法都是VIRTUAL,所以无论覆盖了什么方法都会有运行期绑定的效果,所以很多时候你不想运行期绑定也不行。所以多态形成的条件是  
  1。override   supper   class's   virtual   function  
  2.   use   the   point   or   reference   to   supper   class   to   make   the   method   call.  
  各位谁可以描述一下JAVA的对象模型呢?  
   
  我现在使用面向对象的DATAFLEX语言,在这种语言里面,只能通过句柄传递对象,而对于句柄却没有编译期的TYPECHECK(TYPE的意思是否就是说这个类的所有接口的集合?),所以虽然我使用这种语言构造了一个小型的类层次,但是却只能通过文档来约束大家对于这个小框架的使用,否则就会出现乱七八糟的运行期消息错误。Top

54 楼broaden(broaden)回复于 2002-01-25 11:10:34 得分 0

重载是这样的:它用相同的函数名提供不同的参数调用,在表面上他们的函数名相同,但在内部根据不同的参数,他们的函数名也是不同的.只是提供程序员方便调用的一种做法.  
   
  多态其实并不和虚函数完全相同的,只是在C++中用此方法实现的,注意:在父子类中,如果只是函数名相同,参数不同,它还是叫重载.  
  而在VB中多态并不是由继承实现的,它是靠定义类和实现类来实现的(用implement)Top

55 楼alula(alula)回复于 2002-01-25 13:16:21 得分 0

昨晚翻了一下<设计模式>,注意到个别句子:  
  “多态(polymorphism)是面向对象的核心技术之一”。  
  “类型参数化(type   parameterized)不是严格的面向对象技术”。  
  --   "不是严格"...   头痛。就是说,是实现面相对象的技术,但...   什么呢?  
  还说到“本书中所有的设计模式没有一个使用到template”。Top

56 楼CryingCat(hyg)回复于 2002-01-25 13:22:50 得分 0

谢谢各位的精彩发言,前几天去面试时碰到了这个问题,但我总算没成哑巴Top

57 楼alula(alula)回复于 2002-01-25 13:38:42 得分 0

楼上的,    
  是什么问题来的?   说来听听,说不定有天我也面试遇上这问题。呵呵呵Top

58 楼alula(alula)回复于 2002-01-25 13:43:21 得分 0

<设计模式>在比较   组合、多态和类型参数化   还有一个句子:  
  ...   多态和template都是编译期确定的,只有组合是运行时确定   ...  
  不知道记错了没有,书不在这。  
  又头痛了。Top

59 楼magicblue(小飞侠)回复于 2002-01-25 17:51:06 得分 0

to:do_do  
  我说的一般的书就是国内比较常见的,The   C++   Programming   Language虽然著名,但是看过的人恐怕不多  
  to:alula  
  类型参数化(type   parameterized)和GP的关系密切,和OOP就……Top

60 楼alula(alula)回复于 2002-01-25 19:46:46 得分 0

to   magicblue  
  什么是GP?Top

61 楼harrypotter(哈里*波特)回复于 2002-01-25 20:03:51 得分 0

studyTop

62 楼magicblue(小飞侠)回复于 2002-01-26 13:52:31 得分 0

Generic   Programming  
  泛型编程Top

63 楼xzfyes(dfsf)回复于 2002-01-27 13:50:50 得分 0

多态和重载都是晚期绑定Top

64 楼ioriwellings(八神奄)回复于 2002-01-27 17:50:25 得分 0

收藏Top

65 楼cococut(小鱼的天空)回复于 2002-01-30 09:45:43 得分 0

有体会!Top

相关问题

  • C++重载问题
  • 谁来给我讲讲如何重载 [ ] ?
  • C++的重载问题
  • c++ 输出符的重载??
  • 关于C++模板重载问题
  • 在Dev-C++重载运算符问题
  • C++为什么不这样重载>>
  • java是不是和c++差不多?
  • C/C++编程,关于操作符重载问题~~~~~~???
  • C#、C++和Java中重载和覆盖的一点问题

关键词

  • c++
  • 函数
  • 指针
  • 编译器
  • 编译
  • oo
  • 重载
  • 虚函数
  • 调用
  • 参数

得分解答快速导航

  • 帖主:dynamic_pump
  • 7680
  • TrembleTree
  • qqchen79

相关链接

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

广告也精彩

反馈

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