namespace A
{
struct X;
struct Y;
void f(int);
void g(X);
}
namespace B
{
void f(int i)
{
f(i);//将调用哪个函数?
}
void g(A::X x)
{
g(x);//将调用哪个函数?
}
void h(A::X x)
{
h(x);//将调用哪个函数?
}
}
说明:Koeing 查找规则:如果在声明函数的参数时使用了一个类(这里参数时X,参数类型为A:X),那么在查找正确的函数名时,编译器将会在包含参数类型的空间中也进行函数名字的匹配
有了这个规则指导:
1:因为在B的名字空间中并没有使用using namespace A ;或者using A;将A空间引入其作用域中,所以只在空间B中查找,函数将无限调用自身B::f();
2:虽然在B的名字空间中并没有使用using namespace A ;或者using A;将A空间引入其作用域中,但参数是空间A中的类对象,因此会在A和B空间中都进行检索,恰好两个空间中都有匹配的函数,这时编译器蒙了,不知道调用谁,对这个函数的调用产生了二义性
3:和2一样,但A空间中没有匹配的函数,因此不会产生二义性;无限调用B::h();
思考:若将namespace B 改成class B会是什么情况呢
答案是2:调用也正常
原因是大昂编译器已经找到一个成员函数时,它将不会试图通过koeing规则来查找自由函数。
这时我又想到了继承函数函数的隐藏是不是也是也是这样实现的隐藏,好像是的
但覆盖函数的实现为什么会调用基类的函数呢?没想明白,希望达人看到了,帮忙解释下。
但