多重继承下的名称隐藏:IBM文档与编译结果矛盾?
C++多重继承中名称隐藏的歧义问题
看到某文档称,以下代码里的赋值语句x = 0不存在歧义,理由是B::x的声明隐藏了A::x:
struct A { int x; }; struct B: A { int x; }; struct C: A, B { void f() { x = 0; } }; int main() { C i; i.f(); }
但实际将这段代码编译时,却因歧义无法通过编译。请问该文档的说法是否正确?
结论
该文档的说法错误,这段代码确实存在歧义,具体原因如下:
- 在
C::f()中直接使用x属于非限定名称查找,编译器会先在C自身作用域查找,找不到则遍历所有直接基类(A和B)的作用域。 B中的x确实隐藏了B继承的A::x,但C同时直接继承了A,A::x在C的作用域中是独立可见的;而B::x作为B的成员,在C的作用域中也可见。- 此时两个直接基类中都存在名为
x的成员,编译器无法确定要引用哪一个,因此会报歧义错误。
要消除歧义,必须显式限定要访问的成员,比如写成A::x = 0或者B::x = 0。
内容的提问来源于stack exchange,提问作者xiaokaoy
相关产品推荐
相关产品推荐

