免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4244 | 回复: 7
打印 上一主题 下一主题

[C++] C++ 作用域解析的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-13 19:21 |只看该作者 |倒序浏览
#include <iostream>
class A {
public:
        class B {
        public:
                class C {
                public:
                        virtual void f(){std::cout << "A::B::C\n";}
                };
        };
        class C {
        public:
                virtual void f(){std::cout << "A::C\n";}
        };
};

class D : public A::B::C /* , public A::C */ { //(1)
public:
/*      class C {
        public:
                virtual void f(){std::cout << "D::C\n";}
        };*/  //(2)
        void f(){std::cout << "D\n";}
};

class E {
public:
        virtual void f(){std::cout << "E\n";}
};

int main(){
        D* p = new D; // what about A::B::C* p?
        p->C::f(); //here

}

这么一段程序。here处的C::f会被解析为A::B::C::f。
如果去掉注释(1),会错误说D::C不存在。再去掉注释(2)会错误说D::C不是D的base class。

p应该可以使用所有D的base class的f。对一个不完整的限定比如C::f,编译器应该如何解析得到完整的限定呢(比如A::B::C)?
有没有办法让D继承D::C呢(直接或间接)?

论坛徽章:
0
2 [报告]
发表于 2007-06-13 22:52 |只看该作者
>> 这么一段程序。here处的C::f会被解析为A::B::C::f。
这里有两个候选成员函数:A::B::C::f 和 f,对于调用p->C::f(); ,编译器找到较好的匹配A::B::C::f(当然,这里编译器允许了前缀A::B::的省略)

>> 如果去掉注释(1),会错误说D::C不存在。
这时有三个候选成员函数:A::B::C::f 、A::C::f和 f,此时,由于前面两个成员函数前缀C::之前都有额外的类作用域前缀,于是,既没有精确匹配,也不能推算出无岐义的匹配(如前一种情况中),编译器报错

>> 再去掉注释(2)会错误说D::C不是D的base class。
此时,最佳名字匹配是嵌套类D::C。注意,D::C只是D中一个嵌套类而已,这是一个嵌套类型,其中的成员并不属于D。当然,嵌套类不是它的基类

论坛徽章:
0
3 [报告]
发表于 2007-06-13 22:55 |只看该作者
原帖由 tyc611 于 2007-6-13 22:52 发表
>> 这么一段程序。here处的C::f会被解析为A::B::C::f。
这里有两个候选成员函数:A::B::C::f 和 f,对于调用p->C::f(); ,编译器找到较好的匹配A::B::C::f(当然,这里编译器允许了前缀A::B::的省略)
...

您说的这些原因我当然清楚。想知道精确的规则,语义上的。

论坛徽章:
0
4 [报告]
发表于 2007-06-14 12:05 |只看该作者
在标准里找到了name lookup一节,提到了qualified name lookup。
不过C++标准读起来有些吃力,有没有达人给说说啊
name lookup绝对是个很重要的话题~

name lookup之后才有重载解析,访问控制等等……

论坛徽章:
0
5 [报告]
发表于 2007-06-14 19:43 |只看该作者
为啥我的帖老是没人回??

自己再最后揣一脚~

论坛徽章:
0
6 [报告]
发表于 2007-10-26 21:55 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2009-04-09 21:33 |只看该作者
挖坟。想当初自己问的问题,现在竟然有些看不懂了。惭愧啊

论坛徽章:
0
8 [报告]
发表于 2009-04-09 22:18 |只看该作者
book <<expert c++>>
不逼到头上,我是不会去弄明白的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP