关于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上有错误)
答案 0 :(得分:2)
BB类中的明显重载并非如此:它们 shadow 来自AA类的同名成员函数。
与在内部范围内重新定义名称的想法相同:它在某个外部范围内隐藏相同的名称,因此无论多么有意义,都不考虑外部范围。< / p>
您可以限定来电,例如
void foo2(int b, int d) { AA::foo2(b); }
或通过
引入AA功能作为可见重载using AA::foo2;