条款24 成员函数查找

  成员函数的查找过程要涉及到三个步骤。首先,编译器查找函数的名字,然后从后续的函数选择一个最匹配的函数,最后,编译器检查函数的访问权限。

 大多数与函数名不匹配的错误并不是编译器本身的问题,而是我们对成员函数查找机制的理解有问题。考虑下面的代码:

  

class B {
  public:
    //...
    void f( double );
};
class D : public B {
    void f( int );
};
//...
D d;
d.f( 12.3 ); // 令人困惑
那个成员函数f会被调用呢?我们来分析一下:
1 因为我们是在调用D的对象,所以先在D的定义中查找,得到D::f
2 选择最匹配的函数,现在只有一个,所以只能是void f( int ); (参数12。3从double转换成int 12)
  这样的转换虽然是合法的,但是通常不是我们所希望的。因为有精度丢失。
3 检查访问权限,D中void f( int );是私有的,所以我们会得到一个编译错误。
从上面的例子我们可以看到:
  即使在基类中有更匹配的函数存在,但是一旦编译器在派生类中找到了成员函数,(不管有没有最匹配的函数存在)它也不会
  再在基类中继续查找。可以用一句话来概括,内层作用域的名字会隐藏外层的同名函数
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值