关于C++中重载、覆盖、多态的深层次探讨。

hproof 2009-12-22 11:36:52
我学习C++也有些年头了,大概10年了吧,可是今天却发现对一些概念开始不理解了。在以前的认识中:
重载:父类中用 virtual 修饰,子类重新定义。
覆盖:父类中没有用 virtual 修饰,子类重新定义。
多态:同一个类中多个函数同名,但参数类型、数量不同。

可近日与别人探讨、自己网上查资料,却发现自己的概念完全弄错了?!
(我看过很多网上的资料,所以大家不用在这里解释那几个概念的“标准”定义了)

我只想说,为什么我学C++这么多年了,还会出现这样大的误解?为什么当初我会有那样的理解?
是因为那时候的教材翻译有误?还是我自己理解错了?还是当时(99年左右)大家流行中的概念与现在不同了?

也许我的理解是建立在字面意义上的:
重载:温柔的、技巧性的、稳妥的、有准备的 // 父类中修饰了 virtual,并准备好接受子类的重新定义
覆盖:暴力性的、不温柔的、遮挡住的、无准备 // 父类中被子类覆盖
多态:多种形态,至少视觉上是不一样的 // 同函数名不同的参数表

而当我试图从字面意义上理解,却发现与当前流行的“概念解释”不吻合。是我们的翻译者妥协了?还是我们大家都妥协了?


在当初学习C++的时候,还没有这么多的概念出现。我就像一个远古时代走过来的人,发现身边的一切、甚至概念都改变了。又或者,从一开始我就错了。。。

欢迎对 C++ 学习研究多年的同行们指点,也可以说说你们自己内心的理解和想法。



// 补充:虽然这只是概念上的问题,但请不要这样简单的回答,我希望能获得大家更多的答案和想法。
...全文
617 点赞 收藏 44
写回复
44 条回复
翅膀又硬了 2012年09月06日
我靠,怪不得以前面试总过不了,原来面试官学的教材跟我背的不一样
回复 点赞
彭家老三 2012年09月06日
其实我一直觉得函数的重载在也应该属于广义上的多态.
回复 点赞
disobliging 2012年09月05日
我是个初学者,看到楼主...
难道从事C++不是应该经常跟这些打交道的吗?
老师说:这也是C++中精髓啊!
回复 点赞
碎炎 2012年01月31日
今天笔试也考了
重载 就是相同作用域下的参数不同的函数
覆盖 就是override 重写虚函数
隐藏 就是基类非虚,子类函数重名
回复 点赞
chenqiu1024 2012年01月31日
多态并不是一个跟前三者并列的概念啊!而是应用了重载或覆盖之后能达到的效果

这篇博客讲得比较清楚:
http://blog.163.com/dmg_123456/blog/static/56705063200992395226772/
回复 点赞
Contemplating 2010年01月01日
如果楼主要想深层次理解你标题中所提及的问题,强烈建议你看看Stan Lippman的《Inside C++ Object Model》。另外CSDN有一个网友写了一些列的文章,比较好懂:
http://blog.csdn.net/pathuang68/archive/2009/04/23/4101970.aspx
回复 点赞
jc_ontheroad 2009年12月31日
何必拘泥于这些名词的字面意义呢?掌握面向对象编程,关键还在于理解其精髓,并能灵活地运用,而不在于能够给出这些名词的正确解释。

做到“手上无剑、心中亦无剑”,才是应该追求的境界。
回复 点赞
xwb2766 2009年12月31日
重载(overloading)是在一个名字空间或者作用域之内重名函数,签名不同。跟继承、面向对象并无直接关系。
覆盖(overriding)就是Virtual函数的重写,当然跟继承有关。

面向对象里多态利用的是overriding。

重装、覆盖是方法
多态是形式
回复 点赞
hacker1125 2009年12月31日
mark
回复 点赞
learning0066 2009年12月31日
重载:必须是在同一作用域内,函数名相同。参数的类型,个数,顺序三者中之一不同或都不同。const放在函数后的,也可以是重载的依据。
覆盖:必须是不同作用域内,两函数一模一样,函数名,参数的类型,个数,顺序都完全一样
多态:多态分为动态多态和静态多态。静态多态是通过函数重载,运算符重载实现的,动态多态是通过虚函数实现的
回复 点赞
crst_zh 2009年12月31日
重载?我觉得不如“过载”理解来的好
过载:超负荷了。那么就赋予一个名字不同的解释,就是相同的函数名,执行不同的操作,怎么区别呢?通过参数来区分,参数的数目或者参数的类型。

至于覆盖和多态的理解相对简单一些吧。
回复 点赞
chujun_laiyang 2009年12月31日
好像lz只是对多态的理解有点问题。如果研究一下多态的实现,就会明白“准备好接受子类的重新定义”了
回复 点赞
zenny_chen 2009年12月24日
呵呵,学习10年应该基础已经不错了。
这个时候应该干脆学习C++03标准。其它书都不用再看了。呵呵。
回复 点赞
lkbl123 2009年12月23日
温故而知新~~既然10年了 稍微看下书就清楚了~
回复 点赞
deng1243 2009年12月23日
楼主学的时候用的是什么书?
回复 点赞
猫已经找不回了 2009年12月23日
好帖,mark.
回复 点赞
xue785920414 2009年12月23日
楼主的经验很丰富,但是对一些基础知识还是要温故而知新那
回复 点赞
lori227 2009年12月23日
温故而知新~~既然10年了 稍微看下书就清楚了~
回复 点赞
jackyjkchen 2009年12月23日
拜托,即使你不使用任何面向对象,重载也是存在了……重载基本上不算是面向对象。
回复 点赞
dskit 2009年12月23日
重载:父类中用 virtual 修饰,子类重新定义。
覆盖:父类中没有用 virtual 修饰,子类重新定义。
多态:同一个类中多个函数同名,但参数类型、数量不同

你可别告诉你已经用C++工作了10年了啊。

C++ primer, 深入探索C++对象模型 这两本书有空的时候看一下吧。

重载跟virtual 基本上没有什么关系
多态跟virtual才是一伙的
覆盖父子类中函数同名,但不是虚函数的。
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告