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

dynamic_pump 2002-01-20 11:01:10
...全文
4589 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
cococut 2002-01-30
  • 打赏
  • 举报
回复
有体会!
ioriwellings 2002-01-27
  • 打赏
  • 举报
回复
收藏
xzfyes 2002-01-27
  • 打赏
  • 举报
回复
多态和重载都是晚期绑定
magicblue 2002-01-26
  • 打赏
  • 举报
回复
Generic Programming
泛型编程
broaden 2002-01-25
  • 打赏
  • 举报
回复
重载是这样的:它用相同的函数名提供不同的参数调用,在表面上他们的函数名相同,但在内部根据不同的参数,他们的函数名也是不同的.只是提供程序员方便调用的一种做法.

多态其实并不和虚函数完全相同的,只是在C++中用此方法实现的,注意:在父子类中,如果只是函数名相同,参数不同,它还是叫重载.
而在VB中多态并不是由继承实现的,它是靠定义类和实现类来实现的(用implement)
pploveshao 2002-01-25
  • 打赏
  • 举报
回复
应该是只有子类覆盖了父类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的意思是否就是说这个类的所有接口的集合?),所以虽然我使用这种语言构造了一个小型的类层次,但是却只能通过文档来约束大家对于这个小框架的使用,否则就会出现乱七八糟的运行期消息错误。
harrypotter 2002-01-25
  • 打赏
  • 举报
回复
study
alula 2002-01-25
  • 打赏
  • 举报
回复
to magicblue
什么是GP?
magicblue 2002-01-25
  • 打赏
  • 举报
回复
to:do_do
我说的一般的书就是国内比较常见的,The C++ Programming Language虽然著名,但是看过的人恐怕不多
to:alula
类型参数化(type parameterized)和GP的关系密切,和OOP就……
greensleeve 2002-01-25
  • 打赏
  • 举报
回复
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 :12691399
alula 2002-01-25
  • 打赏
  • 举报
回复
<设计模式>在比较 组合、多态和类型参数化 还有一个句子:
... 多态和template都是编译期确定的,只有组合是运行时确定 ...
不知道记错了没有,书不在这。
又头痛了。
Last_Dodo 2002-01-25
  • 打赏
  • 举报
回复
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有如用电钻当锤子,可用但更容易砸烂手指和电钻(谁说的来着?)。
alula 2002-01-25
  • 打赏
  • 举报
回复
楼上的,
是什么问题来的? 说来听听,说不定有天我也面试遇上这问题。呵呵呵
CryingCat 2002-01-25
  • 打赏
  • 举报
回复
谢谢各位的精彩发言,前几天去面试时碰到了这个问题,但我总算没成哑巴
alula 2002-01-25
  • 打赏
  • 举报
回复
昨晚翻了一下<设计模式>,注意到个别句子:
“多态(polymorphism)是面向对象的核心技术之一”。
“类型参数化(type parameterized)不是严格的面向对象技术”。
-- "不是严格"... 头痛。就是说,是实现面相对象的技术,但... 什么呢?
还说到“本书中所有的设计模式没有一个使用到template”。
wyzh 2002-01-24
  • 打赏
  • 举报
回复
太精采了。
Last_Dodo 2002-01-24
  • 打赏
  • 举报
回复
: gmc007(江西的佬表)
对不起,我的电脑环境是英文的(但装有中文输入软件)而且我中文输入很慢,再加上许多电脑词汇的中译我不知道,所以我常常用英文。
maguey_n 2002-01-24
  • 打赏
  • 举报
回复
c++中的重载是多态性的一种,多态性可以分为静态多态性和动态多态性,其中,静态多态性的表现形式就是重载,而动态多态性是通过虚函数来实现的。
静态多态性就是载编译的时候确定调用哪一个函数,所以,重载的函数一定要有参数的不同。
而虚函数是在运行的时候,通过基类指针指向派生类和虚函数表来实现的。而且,虚函数的函数名和参数一定要相同。
wzheng 2002-01-24
  • 打赏
  • 举报
回复
通过重载来实现多态性。
如你多次重载某个函数。
这个函数在不同的类中使用效果是不同的。即多态性
magicblue 2002-01-24
  • 打赏
  • 举报
回复
do_do的看法在一般书里找不到~~

我觉得在这点上仁者见仁智者见智,有些人就是不认为重载是一种多态,也不能说他错了。观念问题。

“最佳的系统在于你的需要,包括现在和将来。”
加载更多回复(45)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧