免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: converse
打印 上一主题 下一主题

重载,覆盖,和隐藏 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-11-07 20:20 |只看该作者
原帖由 yarco1 于 2005-11-7 20:12 发表

老兄, 你有哪一句话说.
那种情况有怎样的结果.

按照这句话理解.
bar b;
b.p(15);
应该会调用foo::p(int i)


你再看看隐藏我是怎么写的....
这个函数参数不同,所以派生类的函数就会隐藏基类函数的定义....也就是说对一个bar类的p()而言编译器已经认定了就是那个两个参数的函数,不会再向上找函数了....这个时候我们说bar类里面的p函数隐藏了foo类的p函数.....也就是说编译器认为两个类中的p函数根本就是两个函数....但是,如果派生类没有定义名字是p的函数,那么编译器就会沿着继承链向上查找函数的定义,这样就可以找到foo中的p函数了....我说的"在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义"就是这个意思.....需要注意的是如果找到了同名的函数就不会继续找(可能是隐藏或者是覆盖),如果没有找到就会继续向上找.....

[ 本帖最后由 converse 于 2005-11-7 20:26 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2005-11-07 20:43 |只看该作者
谢谢。
辛苦了。
^_^

论坛徽章:
0
13 [报告]
发表于 2005-11-07 22:01 |只看该作者
支持,支持,支持

论坛徽章:
0
14 [报告]
发表于 2005-11-08 00:05 |只看该作者
换个说法:
C++ overload的作用范围域仅限于该class内(java不同).超出该作用域的overload(父子class之间)关系演变成overlap,即derived-class里面的method把父class里面的所由的同名method全部屏蔽了(如果是从derived class下面开始调用的话,直接从parent class调用没有这问题).

overlap可不管什么virtual不virtual的,全干调了
所以C++要严防overlap出险(除非非常特殊的情况,否则一旦出险基本上就是错误发生了).

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
15 [报告]
发表于 2005-11-08 00:26 |只看该作者
所谓的覆盖指的是用派生类对象的指针或者引用时访问虚拟函数的时候会根据实际的类型决定所调用的函数


这里“派生类对象的指针或引用”
是不是应该是“基类对象的指针或引用”?

论坛徽章:
0
16 [报告]
发表于 2005-11-08 08:50 |只看该作者
原帖由 lenovo 于 2005-11-8 00:26 发表


这里“派生类对象的指针或引用”
是不是应该是“基类对象的指针或引用”?


瀑布汗.....确实是这样的现在就去改

论坛徽章:
0
17 [报告]
发表于 2006-02-27 14:39 |只看该作者
这个时候我们说bar类里面的p函数隐藏了foo类的p函数.....也就是说编译器认为两个类中的p函数根本就是两个函数....
是否应该说:也就是说编译器认为两个类中的p函数根本就是一个函数....

论坛徽章:
0
18 [报告]
发表于 2011-12-16 11:16 |只看该作者
新人,谢谢楼主指点!

论坛徽章:
0
19 [报告]
发表于 2011-12-16 11:29 |只看该作者
这个非常不错

论坛徽章:
0
20 [报告]
发表于 2011-12-16 11:34 |只看该作者
不是C++的重载、继承和多态吗?楼主的概念没弄得太清楚吧,怎么感觉似是而非呢?
n年前看过C++的书,感觉党,勿喷!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP