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

上面代码构成了一个 namespace

在 derived class 内的 mf4 代码实现为

void Derived::mf4() {
...
mf2();
...
}

编译器看到 mf2 后现在 mf4 的作用空间查找, 然后到 Derived 的作用空间查找, 最后在 Base 中找到.

2. 我们再考虑前一个例子, 这次让我们重载 mf1 和 mf3

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

从名称查找观点来看, Base::mf1 Base::mf3 不再被 Derived 继承, 因为 Base class 内的函数被遮蔽了

Derived d;
int x;
..
d.mf1();
d.mf1(x); // 错误! Derived::mf1 遮蔽了 Base::mf1
d.mf2();
d.mf3();
d.mf3(x); // 错误! Derived::mf3 遮蔽了 Base::mf3

为了达成本来需要的目的, 我们只需在 Derived class 内添加两行代码

using Base::mf1;
using Base::mf3;

现在, 上面发生错误的代码都不会报错了, 一切按照既定的轨道在前进!

3. 但有时候, 你并不像继承 Base class 的所有函数, 这时可以理解的. 这在 public inheritance 中不可发生(见 item 32) 但 private inheritance 却是有可能的, 那么部分继承的一个很好的解决方案是 转交函数

class Derived: private Base {
public:
virtual void mf1() { // 转交函数
Base::mf1();
...
}
};

Effective C++ Item 33 Avoid hiding inherited names的更多相关文章

  1. 条款33:避免遮掩继承而来的名称(Avoiding hiding inherited names)

    NOTE: 1.derived classes 内的名称会遮掩base classes内的名称.在public继承下从来没有人希望如此. 2.为了让被遮掩的名称再见天日,可使用using 声明方式或转 ...

  2. effective C++ Item 33 避免隐藏继承而来的名字

    1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...

  3. 读书笔记 effective C++ Item 33 避免隐藏继承而来的名字

    1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...

  4. Effective C++ Item 33 避免遮掩继承过来的名称

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie ? 不懂 c++为什么derived classes 内的名称要遮掩 base classe ...

  5. Effective JavaScript Item 33 让构造函数不再依赖newkeyword

    本系列作为EffectiveJavaScript的读书笔记. 在将function当做构造函数使用时,须要确保该函数是通过newkeyword进行调用的. function User(name, pa ...

  6. 读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字

    1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息.消息可以以加密或者明文(未加密)的方式被发送.如果在编译阶段我们有足够的信息来确定哪个信息会 ...

  7. Effective JavaScript Item 38 调用父类的构造函数在子类的构造函数

    作为这一系列Effective JavaScript的读书笔记. 在一个游戏或者图形模拟的应用中.都会有场景(Scene)这一概念.在一个场景中会包括一个对象集合,这些对象被称为角色(Actor). ...

  8. Effective C++ Item 36 绝不又一次定义继承而来的 non-virtual 函数

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:绝对不要又一次定义继承而来的 non-virtual 函数 --> Item 7 ...

  9. 读书笔记 effective c++ Item 36 永远不要重新定义继承而来的非虚函数

    1. 为什么不要重新定义继承而来的非虚函数——实际论证 假设我告诉你一个类D public继承类B,在类B中定义了一个public成员函数mf.Mf的参数和返回类型并不重要,所以假设它们都是void. ...

随机推荐

  1. spark-streaming问题集锦

    报错: // :: ERROR Utils: Exception encountered py4j.Py4JException: Cannot obtain a new communication c ...

  2. 【Java】高并发同步Volatile的使用

    引言: 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的Synchronized,它在多处理器开发中保证了共享变量的“可见性”. 可见性的意思 ...

  3. freemarker插值

    http://blog.csdn.net/chang_li/article/details/51913105 在复杂页面上(包含大量判断.日期金额格式化)的页面上,freemarker的性能比使用ta ...

  4. VBA学习笔记(7)--vba的数组函数

    说明(2017.3.25): 1. split(str,"-")和join(arr,",")函数,用法跟其他语言差不多. 2. filter函数,filter( ...

  5. CentOS 6.5 x64下Hadoop安装

    Apache Hadoop安装部署模式 单机(本地)模式(Standalone Mode) 伪分布模式(Pseudo-Distributed Mode) 完全分布模式(Fully Distribute ...

  6. 模仿Struts2的Interceptor拦截器实现

    模仿Struts2的Interceptor拦截器实现 public interface Invocation { public Object invoke(); } public interface ...

  7. asp.net mvc 4 AntiForgery 提供的防伪标记适用于用户“”,但当前用户为“XX” 问题处理记录

    情景:    某页面未登录下可以访问,但具体操作时发现未登录就弹出登录窗,待完成登录后继续操作. 当登录成功,前端继续操作(post后端接口)时发现以下错误:   提供的防伪标记适用于用户“”,但当前 ...

  8. centos7 firewalled

    FirewallD 使用服务(service) 和区域(zone)来代替 iptables 的规则(rule)和链(chain). 默认情况下,有以下的区域(zone)可用: drop – 丢弃所有传 ...

  9. nginx connect() failed,Connection refused,while connecting to upstream fastcgi

    connect() failed (111: Connection refused) while connecting to upstream fastcgi://127.0.0.1:9000 net ...

  10. archdexls主题游戏页面game-play.php有评论时,报错( ! ) Warning: printf(): Too few arguments in D:\wamp\www\wp-content\themes\arcadexls\games-play.php on line 97

    ( ! ) Warning: printf(): Too few arguments in D:\wamp\www\wp-content\themes\arcadexls\games-play.php ...