名字查找 与名字空间

本文探讨了C++中Koenig查找规则的应用场景及可能导致的二义性问题。通过具体的代码示例,分析了不同情况下编译器如何在多个命名空间中查找匹配的函数,并讨论了类作用域和成员函数查找的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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规则来查找自由函数。

 

这时我又想到了继承函数函数的隐藏是不是也是也是这样实现的隐藏,好像是的

但覆盖函数的实现为什么会调用基类的函数呢?没想明白,希望达人看到了,帮忙解释下。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值