根据 https://www.ibm.com/docs/en/i/7.5?topic=only-name-hiding,以下代码中的赋值
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();
}
这是正确的吗?这对我来说听起来违反直觉,所以我尝试将其复制到 https://cpp.sh/ 来编译它。由于含糊不清,它没有编译成功。
你的编译器是对的。文章有误。
他们所说的关于姓名隐藏的说法适用于此:
struct A {
int x;
};
struct B: A {
int x;
void f() { x = 0; }
};
如果
int x;
中没有 B
,则 x
中的 f()
将引用 A::x
,但该成员从基础中隐藏了同名成员,因此 x
中的 f
确实如此请参阅B::x
。没有任何歧义。
但这并不适用于多重继承,如页面上的示例所示:
struct A { int x; }; struct B: A { int x; }; struct C: A, B { void f() { x = 0; } };
如果
struct C: A,B
与 struct C: B,A
的顺序决定了 x
的名称查找,那实际上会很奇怪。相反,简而言之,成员的非限定名称查找的工作方式如下:
这只是一个非常简单的视图(足以理解示例),有关详细信息,我建议您参考https://en.cppreference.com/w/cpp/language/unqualified_lookup。