重复继承。暧昧

时间:2013-03-01 11:03:42

标签: inheritance ambiguity qualifiers

让我们假设情况。

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;出现歧义?

1 个答案:

答案 0 :(得分:0)

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