调用一个成员函数,涉及三个步骤:第一步,编译器查找函数的名字;第二部,从可用候选者中选择最佳匹配函数;第三步,检查是否具有访问该函数的权限。

#include<iostream>
using namespace std; class B{
public:
void f(double para){
cout<<"B::f"<<para<<endl;
}
};
class D:public B{
//void f(int para){}; //私有成员,编译main中 d.f(12.3)行,会报错
public:
void f(int para){
cout<<"D::f"<<para<<endl;
}
};
class E:public D{
int f;
}; int main()
{
D d;
d.f(12.3); //输出D::f12 E e;
e.f(12.3); //错误
return ;
}

分析:

  步骤1:查找函数的名字。因为我们正在调用一个D对象的成员,所以将从D的作用域开始查找并且立即定位到D::f上。

  步骤2:从可用的候选者中选择最佳的匹配函数。我们只有一个候选者D::f(为什么只是一个,往后面看),因此会尝试匹配该函数。可以通过将实参12.3从double转换为int而做到这一点(这是合法的,但通常不是我们想要的,因为那样会丢失精度)。

  步骤3:检查访问权限。我们(可能)会得到一个错误,因为D::f是私有成员。

基类中的哪一个看上去有着更好的匹配、并且可访问的函数f已经无关紧要,因为一旦在内层作用域中找到一个,编译器就不会到外层作用域中继续查找该名字。内层作用域中的名字会隐藏外层作用域中相同的名字。在这一点,C++不同于Java。Java中,内层作用域的方法名字和外层作用域中同名方法属于重载关系。

  实际上,改名字甚至不是一个函数的名字:

class E:public D{
int f;
};
//...
    E e;
e.f(12.3); //错误
 

反思:

  在这个例子中,我们得到一个编译器错误,因为在作用域E中查找名字f,结果找到了一个数据成员,而不是成员函数。顺便说一下,这也是建立并遵从简单的命名诸多理由之一。如果数据成员E::f被命名为 f_ 或者 m_f,它就不会隐藏被继承的基类函数 f 了

成员函数查找[条款24]---《C++必知必会》的更多相关文章

  1. RecyclerView 必知必会(转)

    [腾讯Bugly干货分享]RecyclerView 必知必会 本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com ...

  2. 第5节:Java基础 - 必知必会(下)

    第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...

  3. MySQL必知必会1-20章读书笔记

    MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...

  4. mysql必知必会——GROUP BY和HAVING

    mysql必知必会——GROUP BY和HAVING 创建表结构 create table `employ_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...

  5. 【MySQL 基础】MySQL必知必会

    MySQL必知必会 简介 <MySQL必知必会>的学习笔记和总结. 书籍链接 了解SQL 数据库基础 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文 件或一 ...

  6. SQL 必知必会

    本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...

  7. 《C++必知必会》学习笔记

    转载:http://dsqiu.iteye.com/blog/1734640 条款一 数据抽象 抽象数据设计遵循步骤:(1)为类型取一个描述性的名字.(2)列出类型所能执行的操作,不要忘了初始化(构造 ...

  8. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  9. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

随机推荐

  1. VS2005环境下采用makefile编译、使用libjpeg.lib函数库

    1.从www.ijg.org下载源码,解压后得到文件夹jpeg-8d 2.在文件夹里新建jconfig.h文件,将jconfig.vc里的内容拷到jconfig.h中 3.编译. Run->CM ...

  2. LPCTSTR —— 摘自百度百科

    LPCTSTR用来表示字符是否使用UNICODE. 如果程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串. 类型理解:L,表示 ...

  3. H&M

    H&M于1947年由Erling Persson在瑞典创立.如今,H&M在全世界1500 多个专卖店销售服装.配饰与化妆品.位于瑞典市Stora Gatan大街的老H&M店是世 ...

  4. 设置两个WdatePicker的开始时间小于结束时间,结束时间大于开始时间

    contract_start_date_id为开始时间ID contract_end_date_id为结束时间ID $("#contract_start_date_id").bin ...

  5. 关于CentOS系统中,文件权限第11位上是一个点的解读

    http://blog.csdn.net/dashuai03091199/article/details/38920833 http://blog.csdn.net/xinlongabc/articl ...

  6. A mail sent to Google chromium.org Groups for Help

    Hi, I've ported Chromium M39 to 4.4 using WebView. The main modifications are: I changed AwContents: ...

  7. php求数学对数

    php的对数函数并不是很强大 有自然对数 有10的对数的函数,不过没有自定义底的对数函数,所以自己写了一个 <?php function xsqrt($x, $value) { $count = ...

  8. tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案

    转:tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案 检查tomcat与web工程对应版本,tomcat中对应版本的jar包拷贝到web工程 ...

  9. HashMap实现原理、核心概念、关键问题的总结

    简单罗列一下较为重要的点: 同步的问题 碰撞处理问题 rehash的过程 put和get的处理过程 HashMap基础: HashMap的理论基础:维基百科哈希表 JDK中HashMap的描述:Has ...

  10. 深度解析Objective-C笔试题

    2011-08-11 17:39 佚名 互联网 字号:T | T 本文介绍的是Objective-C笔试题,先来问一个,为什么很多内置类如UITableViewController的delegate属 ...