本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


? 不懂 c++为什么derived classes 内的名称要遮掩 base classes 内的名称。

经验:derived classes 内的名称会遮掩 base classes 内的名称。

在 public 继承下从来没有人希望如此。

C++ 的名称遮掩规则所做的唯一事情就是: 遮掩名称

derived class 作用域被嵌套在 base class 作用域里

class Base {
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
//...
}; class Derived: public Base{
virtual void mf1() {};
void mf3();
void mf4();
//...
}; Derived d;
int x;
d.mf1(); //ok. 调用 Derived::mf1
d.mf1(x); //error. 由于Derived::mf1遮掩了 Base::mf1
d.mf2(); //ok. 调用 Base::mf2
d.mf3(); //ok. 调用 Derived::mf3
d.mf3(x); //error. 由于Derived::mf3遮掩了 Base::mf3

解析:

名称遮掩原则

int x, double x的名称都是x,

void mf(double x) ,void mf()的名称都是mf



纠正1:使用 using 声明式

class Base{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
//...
};
class Derived: public Base{
public:
using Base::mf1; //让 Base class 内名为mf1和mf3的全部东西在 Derived 作用域内都可见(而且 public)
using Base::mf3;
virtual void mf1();
void mf3();
void mf4();
//...
}; Derived d;
int x;
d.mf1(); //ok. 调用 Derived::mf1
d.mf1(x); //ok. Base::mf1
d.mf2(); //ok. 调用 Base::mf2
d.mf3(); //ok. 调用 Derived::mf3
d.mf3(x); //ok. Base::mf3

纠正2:转交函数(forwarding function)

class Base{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
//... 与前同
};
class Derived: private Base{
virtual void mf1() //转交函数
{Base::mf1();}
}; Derived d;
int x;
d.mf1(); //ok. 调用的是 Derived::mf1
d.mf1(x);//error. Base::mf1()被遮掩了

Effective C++ Item 33 避免遮掩继承过来的名称的更多相关文章

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

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

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

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

  3. Effective C++ 33 避免遮掩继承而来的名称

    首先介绍一个原则LSP(Liskov Substitution Principle),如果Class D以Public方式继承Class B,则所有B对象可以派上用场的任何地方,D对象一样可以派上用场 ...

  4. 读书笔记 effective c++ Item 32 确保public继承建立“is-a”模型

    1. 何为public继承的”is-a”关系 在C++面向对象准则中最重要的准则是:public继承意味着“is-a”.记住这个准则. 如果你实现一个类D(derived)public继承自类B(ba ...

  5. 读书笔记 effective c++ Item 34 区分接口继承和实现继承

    看上去最为简单的(public)继承的概念由两个单独部分组成:函数接口的继承和函数模板继承.这两种继承之间的区别同本书介绍部分讨论的函数声明和函数定义之间的区别完全对应. 1. 类函数的三种实现 作为 ...

  6. Effective C++ Item 33 Avoid hiding inherited names

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

  7. Effective C++ Item 34 区分接口继承与实现继承

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 关联条款 Item 36 接口继承和实现继承不同.在 public 继承下, derived ...

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

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

  9. Effective C++ Item 44 将与參数无关的代码抽离 templates

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:Templates 生成多个 classes 和多个函数,所以不论什么 templat ...

随机推荐

  1. Tomcat详细用法学习(一)

    在之前有关Tomcat的随笔<Tomcat免安装版的环境变量配置以及Eclipse下的Tomcat配置和测试>和<其他主机连接本地主机Tomcat会出现的防火墙问题>中已经详细 ...

  2. MFC 对话框中动态创建N级菜单以及响应事件

    创建一个基于对话框的工程,工程名为CreateMenu 为该对话框增加一个文件菜单项和测试菜单项,如下图所示   测试菜单项至少要有一个子菜单项 在对话框属性中关联该菜单 在resource.h中增加 ...

  3. HDU 1007 近期点对

    分治法求近期点对 递归将点不断分成小组.计算最短距离.此时的最短距离不过两点都属两块的某一块(这里的切割点是mid点). 还须要考虑两点分属两块的情况. 这时对于选点则把范围缩小到了以mid为中心. ...

  4. IBinder在进程之间传递一个对象的形式(一)

    主张 什么时候service通常被称为远程时的,用到aidl来定一个接口供service和client来使用,这个事实上就是使用Binder机制的IPC通信.当client bind service成 ...

  5. Delphi对WM_NCHITTEST消息的处理

    前提:WM_NCHITTEST是很重要的,只要鼠标在活动,Windows无时无刻在发这个消息进行探测. ------------------------------------------------ ...

  6. [Android]图片资源管理学习

    一.概念 几个概念:1.像素:像素是组成图像的最基本单位:点该点自身有大小,其中保存了颜色值 2.屏幕尺寸:screen size手机屏幕的物理尺寸.单位:inch(英寸)ex:4.0英寸 3.8英寸 ...

  7. 解决编译apache出现的问题:configure: error: APR not found . Please read the documentation - ____哊.時^随记 - 51CTO技术博客

    解决编译apache出现的问题:configure: error: APR not found . Please read the documentation - ____哊.時^随记 - 51CTO ...

  8. HTML表格标签的使用-&lt;table&gt;

    <html> <head> <title> 表格标签 </title> <!-- 标签名:table 定义一个表格 子标签:<caption ...

  9. GitHub基本操作(转)

    一.上传代码到仓库 步骤一:创建本地仓库,如下: 创建结果: 步骤二:发布自己创建的仓库,如下: 发布完显示如下: 步骤三:向自己发布仓库上传代码,如下: 首先将代码复制到本地仓库,如下: 复制完,显 ...

  10. malloc函数的一种简单的原理性实现

    malloc()是C语言中动态存储管理的一组标准库函数之一.其作用是在内存的动态存储区中分配一个长度为size的连续空间.其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针 ...