本文为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. MS Project 2007 工期、工时、资源、固定单位、固定工期、固定工时

    0. 基本概念 工期:指完成每项项目任务所经历的实际时间,及开始日期和结束时期之差.Project中,工期的默认单位是天. 工时:指将任务分配给资源后,每个资源执行任务的工作时间.Project中,工 ...

  2. Windows DIB文件操作具体解释-5.DIB和调色板

    Windows调色板是256色显卡时期的产物,如今显卡最少也是16bit的了.所以调色板基本上是用不到了的. 可是以下几种情况还是须要去使用和了解调色板: 1.在新显卡上保证256色兼容模式的正常执行 ...

  3. HDU 1535 Invitation Cards(SPFA,及其优化)

    题意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接到达终点站,是单向的,每条路线有它自己的车费. 有P个人早上从1出发,他们要到达每一个公交站点, 然后到了晚上再返回点1. ...

  4. Java Web Services (1) - 第1章 Web服务快速入门

    SCRIPTS_DIR=/Users/liuzhaofu/opus-dev/product/tools/devPRODUCT_DIR=/Users/liuzhaofu/opus-dev/product ...

  5. linux-sfdisk 使用方法

    功能说明:硬盘分区工具程序. 语 法:sfdisk [-?Tvx][-d <硬盘>][-g <硬盘>][-l <硬盘>][-s <分区>][-V < ...

  6. thinkPHP 输出及其模板调用(三)

    原文:thinkPHP 输出及其模板调用(三) ThinkPHP 的输出(重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出(thinkphp\Home\L ...

  7. 在Windows系统上实现轻量级的线程间及进程间消息队列

    Windows没有message queue累世的IPC内核对象,使得在在处理IPC时少了一种传递消息的手段. 利用Windows的Naming Object可以实现一套简单的Inter-Thread ...

  8. 浅谈Jquery的使用上篇

    一. 1.Jquery是什么?有什么特性? jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取.HTML 元素操作. CSS 操作 .HTML 事 ...

  9. MFC模态对话框的消息循环

    MFC模态对话框的消息循环 单线程程序, 当主窗口响应函数中弹出模态对话框时,为什么主窗口响应函数可能照常工作? 当弹出模态对话框时,线程的消息循环无法返回,父窗口的事件本应没人处理,应该处于卡死状态 ...

  10. BroadcastReceiver总结

    一.工程整体图 二.activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ ...