【问题标题】:Repeated inheritance. Ambiguous重复继承。模糊的
【发布时间】:2013-03-01 11:03:41
【问题描述】:

假设情况。

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

【问题讨论】:

  • 顺便说一句,我在 Visual Studio 2012 中尝试了这段代码(默认编译器设置)并编译了它。但是 gcc - 4.6 ( ubuntu ) 给出了这个错误。据我了解,这是 gcc - 4.6 问题,还是???我不知道,如果有人对此有所了解,请写下答案。

标签: inheritance ambiguity qualifiers


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多