c ++方法通过g ++中的不同命名空间继承

时间:2014-06-02 14:04:13

标签: c++ inheritance namespaces g++

关于c ++中方法可见性的一个小问题。说这段代码:

namespace A
{
   class AA
   {
      public :
         AA() {}

         void foo1(int a) {} //will be overloaded in B::BB
         void foo2(int a) {} //will be overloaded in B::BB
         void foo3(int a) {} //won't be overloaded
   };
}

using namespace A;

namespace B
{
   class BB : public A::AA // ( A:: facultative but it's to test without the using namespace )
   {
      public:
         BB() : AA() {}

         void foo1(int b, int d) { AA::foo1(b); } //works
         void bar3(int b, int d) { foo3(b); } //works

         void foo2(int b, int d) { foo2(b); }
         //doesn't work, "error : B::BB::foo2(int) not declared"
   };
}

这就像......对我来说非常奇怪:为什么编译器会在B :: BB中搜索foo2,而它却发现了foo3?我的意思是,我理解它是因为我重载了foo2而不是foo3,但为什么会出现这样的行为呢?标准中有什么东西可以讨论这个案例,还是g ++中的错误行为/错误? (注意:我在gnu90,gnu99和c ++ 11上有错误)

1 个答案:

答案 0 :(得分:2)

BB类中的明显重载并非如此:它们 shadow 来自AA类的同名成员函数。

与在内部范围内重新定义名称的想法相同:它在某个外部范围内隐藏相同的名称,因此无论多么有意义,都不考虑外部范围。< / p>

您可以限定来电,例如

void foo2(int b, int d) { AA::foo2(b); }

或通过

引入AA功能作为可见重载
using AA::foo2;