多重继承时名称隐藏

问题描述 投票:0回答:1

根据 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/ 来编译它。由于含糊不清,它没有编译成功。

c++ multiple-inheritance name-hiding
1个回答
0
投票

你的编译器是对的。文章有误。

他们所说的关于姓名隐藏的说法适用于此:

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

© www.soinside.com 2019 - 2024. All rights reserved.