首先看下下面这个例子:

class Base{
private:int x;
public:virtual void mf1() = 0;virtual void mf2();void mf3();...
};
class Derived : public Base{
public:virtual void mf1();void mf4();...
};

这个函数里面还有纯虚函数,虚函数以及非虚函数。
如果这里derived class调用了一个mf2函数的话,那么那么会先在derived class的范围类线进行mf2的查找,再在base class中进行查找,最后才是全局作用域。
那么如果是下面这个例子的话:
 1 class Base{
 2 private:
 3     int x;
 4 public:
 5     virtual void mf1() = 0;
 6     virtual void mf1(int);
 7     virtual void mf2();
 8     void mf3();
 9     void mf3(double);
10     ...
11 };
12 class Derived : public Base{
13 public:
14     virtual void mf1();
15     void mf3();
16     void mf4();
17     ...
18 };    

在这个例子中,基类中的所有的被声明为mf1,mf3的函数都会被覆盖掉(注意,不管参数列表是如何的,也不管基类中是virtual还是non-virtual函数)。
如果这种情况下想要能够选取到基类作用域中的mf1以及mf3,使得继承机制能够起作用的话就应该使用using声明:
 1 class Base{
 2 private:
 3     int x;
 4 public:
 5     virtual void mf1() = 0;
 6     virtual void mf1(int);
 7     virtual void mf2();
 8     void mf3();
 9     void mf3(double);
10     ...
11 };
12 class Derived : public Base{
13 public:
14     using Base::mf1;
15     using Base::mf3;
16     virtual void mf1();
17     void mf3();
18     void mf4();
19     ...
20 };    

然而可能有时候不希望集成基类中的所有函数,这时候就应该注意了,应为public提供的is-a的关系,所以说如果一旦不希望继承基类中的所有的函数,那么可能public集成并不是真正我们希望用到的关系,正如一个矩形与一个正方形之间的关系一样。这种只想继承一部分函数的欲望在私有继承制之下是可以得到满足的,例如下面这样:(不过要用到一点技巧)

 1 public:
 2     virtual void mf1() = 0;
 3     virtual void mf1(int);
 4     ...
 5 };
 6 class Derived: private Base{
 7 public:
 8     virtual void mf1(){    //    注意这里只能使用这种形式进行函数的转接,使用类似前面的类似的using声明达不到相同的结果。
 9         Base::mf1();
10     }//转交函数。
11 };

类似的,转交函数也同样用在不支持using声明的编译器上面。
小结:
1.derived class中的名称会遮掩bass class中的名称,这是使用public集成不希望看到的
2.出现这种情况时,可以使用using声明护着转接函数来改善这种情况。

转载于:https://www.cnblogs.com/-wang-cheng/p/4889762.html

条款33:避免遮掩继承而来的名称相关推荐

  1. Effective C++:条款33:避免遮掩继承而来的名称

    (一) 以下这段代码: int x; void someFunc() {double x; //local variablestd::cin>>x; //read a new value ...

  2. 【Effection C++】读书笔记 条款32~条款33

    [Effection C++]继承与面向对象设计 条款32:确定你的public继承塑模出is-a关系 "public 继承"意味着"is a".适用于base ...

  3. java实验33 类的继承2_java实验2 类的继承性

    实验2 类的继承性 一.实验目的 掌握面向对象的继承性在Java中的实现方法:掌握super关键字的用法,体会抽象类和抽象方法的作用. 二.实验内容 1.程序理解: 1)类的继承 2)第4章课后编程第 ...

  4. 《Effective C++》读书笔记(第二部分)

    6. 继承与面向对象设计(Inheritance and Object-Oriented Design) 条款32: 确定你的public 继承塑模出is-a 关系 本条款告诉读者一个非常基本的继承思 ...

  5. Effective C++ 读后感

    文章目录 前言 读后感 结语 前言 从开始学习Effective C++ 到今天为止 第一遍学习完,历时42天.为什么说是第一遍学习完呢?因为后面肯定还有第二遍第三遍-复习与巩固.**谈谈为啥要学习这 ...

  6. Effective C++阅读笔记

    1,cpp的四个特点 c, object-oriented cpp, template cpp, STL 2, 不要用 #define 使用 const, enum, inline替换define, ...

  7. Effective C++ 中文版(第三版)读书笔记 更新ing~

    Effective C++ 中文版(第三版)持续更新ing 让自己习惯C++ 条款1 视c++为一个联邦 条款2 尽量以const,enum,inline替换#define 条款3 尽可能使用cons ...

  8. Effective C++:改善程序与设计的55个具体做法

    Effective C++:改善程序与设计的55个具体做法 二.构造/析构/赋值运算 05 Know what functions C++ silently writes and calls. 06 ...

  9. more effective c++和effective c++读书笔记

    转载自http://bellgrade.blog.163.com/blog/static/83155959200863113228254/,方便日后自己查阅, More Effective C++读书 ...

最新文章

  1. ubuntu chm文档阅读器
  2. CTF大赛学习第一天!!!(学习中)
  3. 一个简单的c++/cli中委托与事件的处理模型
  4. 阅读分析下列html,阅读下列说明和 HTML 文本,分析其中嵌入的 JavaScript. 脚本..._考试资料网...
  5. 字节面试官:如何实现Ajax并发请求控制
  6. 【HYSBZ - 1088 】扫雷Mine (简单dp)
  7. 关于tcp网络通讯的几个场景的小测试
  8. 分布式数据库选型——数据水平拆分方案
  9. xml动态生成java_从XML文档动态生成Java类
  10. jQuery实现一个图片左右滚动
  11. 思科生成树协议STP/RSTP
  12. 如何防止在ListBox中添加很多数据出现不停的刷新?
  13. 程序设计导引及在线实践之大整数除法
  14. 数字图像处理第三版中文版部分答案-冈萨雷斯
  15. 查看计算机桌面隐藏文件夹,怎么查看隐藏文件?2种方法教你查看电脑中的隐藏文件...
  16. 数据库学习--数据库基本概念
  17. 压摆率//电源抑制比//共模抑制比//直流增益、带宽和相位裕度//静态功耗和直流工作点
  18. Office application 版本
  19. Excel中IF函数的嵌套用法(多条件)
  20. vs2015 相关

热门文章

  1. eslint 保存自动格式化_ESLint一款可组装的JavaScript和JSX检查工具
  2. java list数组排序_浅谈对象数组或list排序及Collections排序原理
  3. c 导入数据到oracle,excel中数据导入到Orcale数据库表中的方法 | 学步园
  4. numpy 随机数_数据分析numpy基础看着一篇就够了
  5. request body 里丢东西了_26. Scrapy 框架-模拟登录-Request、Response
  6. utm虚拟机安装linux,UTM: 在 iOS 上安装 Windows 或 Linux 等系统及虚机安装过程
  7. MySQL限制CPU资源使用_压缩大文件时如何限制CPU使用率?----几种CPU资源限制方法的测试说明...
  8. 如何在liferay ,struts2中跳转页面
  9. VUE第三篇 入门后续
  10. 工具|渗透测试之5种工具分享(Shiro插件、CTFR、JR-scan、dirsearch-Web等)