免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8555 | 回复: 19
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-07 18:11 |只看该作者 |正序浏览
这几个概念都有一个共同点:函数名称相同,所以不免让人混淆,大致的区别如下:

重载:必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个是重载的重要特征

覆盖:覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数,既然是和虚拟函数挂钩,说明了这个是一个多态支持的特性,所谓的覆盖指的是用基类对象的指针或者引用时访问虚拟函数的时候会根据实际的类型决定所调用的函数,因此此时派生类的成员函数可以"覆盖"掉基类的成员函数.
注意唯有同名且参数相同还有带有virtual关键字并且分别在派生类和基类的函数才能构成虚拟函数,这个也是派生类的重要特征.
而且,由于是和多态挂钩的,所以只有在使用类对象指针或者引用的时候才能使用上.
总之一句话:覆盖函数都是虚函数,反之不然~~

隐藏:指的是派生类的成员函数隐藏了基类函数的成员函数.隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个同名(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义....
回到隐藏的定义中,前面已经说了有virtual关键字并且分别位于派生类和基类的同名,同参数函数构成覆盖的关系,因此隐藏的关系只有如下的可能:
1)必须分别位于派生类和基类中
2)必须同名
3)参数不同的时候本身已经不构成覆盖关系了,所以此时是否是virtual函数已经不重要了
  当参数相同的时候就要看时候有virtual关键字了,有的话就是覆盖关系,没有的时候就是隐藏关系了


大致的区别和共同点就是这些.....我也是花了N长时间在血与泪的教训中总结出来的,说的不对的地方大家斧正~~

[ 本帖最后由 converse 于 2005-11-8 08:51 编辑 ]

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

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

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

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

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


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


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

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


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

论坛徽章:
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出险(除非非常特殊的情况,否则一旦出险基本上就是错误发生了).

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

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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP