免费注册 查看新帖 |

Chinaunix

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

<<Exceptional C++>>条款21的一个疑问 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-05-03 09:43 |只看该作者
我记得,这种情况下即使不加virtual, child::f仍然是虚函数...

论坛徽章:
0
12 [报告]
发表于 2012-05-03 09:53 |只看该作者
不是这样么:
虽然p的静态类型是个base,但调用f的时候发现f是个虚函数,于就在根据其实际类型来调用f,发现child里一个f恰好与我们要调用的f长得一模一样,于是这个child::f就被调用了。

论坛徽章:
0
13 [报告]
发表于 2012-05-03 10:55 |只看该作者
using这事和你那个问题没关系,这时打印的会是"child f",因为child f覆盖base f。但如果把child里加上using
就会打印出"base f" using可以使base中的函数参与到重载解析。

论坛徽章:
0
14 [报告]
发表于 2012-05-03 11:17 |只看该作者
本帖最后由 liwangli1983 于 2012-05-03 11:32 编辑
zuiwei 发表于 2012-05-02 18:44
条款21: GotW#5 改写虚拟函数(Overriding Virtual Functions)

里面说到: 重载解析程序(overload resolut ...


去翻了下<<Exceptional C++>>条款21,人家那里pb->f(1.0)调用base::f(double)的原因是在派生类里没有重定义虚函数f(double),当然只能调用base::f(double)了。

论坛徽章:
0
15 [报告]
发表于 2012-05-03 17:42 |只看该作者
回复 8# starwing83

你错了。这里和C++对象模型一点都没关系。为了确保构成重载,overloading resolution之前首先需要考虑overloadable declarations,此时会发生name lookup。name lookup的时候只考虑id-expreesion和scope,不考虑被查找name关联entity的type(事实上不见得能有type,比如说namespace name,虽然和这个例子无关),更不考虑signature。
signature不是function name的一部分,反过来才是。

论坛徽章:
0
16 [报告]
发表于 2012-05-03 17:55 |只看该作者
向LZ道歉……开始眼残看成child* pb……
因为是基类指针调用成员,using的确是没什么直接关系。
编译时静态重载解析决定调用base的哪个函数,由于找到的那个best fit成员函数是virtual的,又没用base::f这样无视virtual的方式,在运行时调用的是根据动态类型找到final overrider,也就是child的成员函数。
pb->base::f(1.0)没问题这个结论倒还是一样。

论坛徽章:
0
17 [报告]
发表于 2012-05-03 18:05 |只看该作者
幻の上帝 发表于 2012-05-03 17:55
向LZ道歉……开始眼残看成child* pb……
因为是基类指针调用成员,using的确是没什么直接关系。
编译时静 ...


果然是标准帝.

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
18 [报告]
发表于 2012-05-03 21:44 |只看该作者
回复 15# 幻の上帝


    好像是这样……好久不碰C++了……

其实之前的想法比较想当然了,在编译期间实际上没决定重载前根本没法决定签名——各种类型转换神马的……所以才有了重载解析存在的必要,要不然就直接哈希了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP