为什么C编译器不会在继承的公共方法和具有相同名称的继承私有方法之间消除歧义?

前端之家收集整理的这篇文章主要介绍了为什么C编译器不会在继承的公共方法和具有相同名称的继承私有方法之间消除歧义?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我很困惑为什么C编译器不会接受这个:
class Foo { 
    private: void Baz() { }
  };

  class Bar {
    public: void Baz() { 
  };

  class FooBar : public Foo,public Bar { };

  void main() {
    FooBar fb;
    fb.Baz();
  }

gcc给出的错误是:

request for member ‘Baz’ is ambiguous
 candidates are: void Bar::Baz()
                 void Foo::Baz()

但是我想要Bar :: Baz()并不明显,因为Foo :: Baz()是私有的吗?为什么编译器不会在这里消除歧义?

解决方法

名称解析分两个阶段进行.首先查找名称,然后检查名称以进行访问.如果名称查找不明确,则永远不会考虑访问.

至于为什么,也许这是一个刻意的语言设计,但我认为更可能只是简化解析名称的过程.这些规则已经非常复杂了.

猜你在找的C&C++相关文章