0

让我们假设情况。

struct Top
{
  int x;
};

struct Left : public Top
{};

struct Right : public Top
{};

struct Bottom : public Left, public Right
{
  void foo()
  {
    Left::x; // Normal compiled
  }

  void goo()
  {
    Left::Top::x; // error: ‘Top’ is an ambiguous base of ‘Bottom’ // Why --- ????
  }
};

有人可以解释一下为什么在函数 goo() 编译器中会出现歧义错误吗?

我写了 void foo() 来表明如果我通过限定符 Left::x; 访问 x; 没有歧义,所以为什么当我使用更详细的访问限定符 Left::Top::x; 出现歧义?

4

1 回答 1

0

您的问题在 OOP 语言中称为“钻石问题”。请记住, :: 只是指导在哪里可以找到某些东西,而不是如何明确地获取那个东西。在方法 foo 中,您引用的 x 是 left 已知的。到目前为止还可以。但是在方法 goo 中,您的说法是“获取 Top< 已知的 x >,Left 已知的 x”。但是这个引用并没有改变这样一个事实,即您的 Right 类也知道 Top 类。因此,在您的情况下,Left::Top::x 与编写 Top::x 相同。结果是,它是模棱两可的,你想要哪个Top的x,是Left继承的那个,还是Right的那个。当然,在您的情况下,它只是一种编译器无法运行的单一类型。但这是一个通用规则,这样的东西很快就会变得很奇怪;)

于 2013-08-20T08:42:39.263 回答