本文为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()被遮掩了

最新文章

  1. Android开机启动程序
  2. 点燃圣火! Ember.js 的初学者指南
  3. [my]_ubuntu12.10_/etc/apt/sources.list
  4. Unix 编程
  5. jsp - 引用 jar包.
  6. Javascript 设计模式 辛格尔顿
  7. python解析命令行
  8. 求m和n的最大公约数和最小公倍数
  9. js中set和get的用法
  10. cs231n spring 2017 lecture6 Training Neural Networks I 听课笔记
  11. duilib消息类型
  12. Spring AOP (二)
  13. Volley解析之表单提交篇
  14. react-native run-android时 SDK location not found.报错
  15. AutoLayout的坑
  16. Jmeter入门(压力测试)
  17. Python-初识模块
  18. CentOS 7.X 系统安装及优化
  19. 030 分布式集群中,设定时间同步服务器,以及ntpd与ntpdate的区别
  20. phpbbchina恢复上线

热门文章

  1. 【Node.js 自己封装的库 http_parse, libuv】
  2. javascript实现的可改变滚动方向的无缝滚动
  3. rsyslog+LogAnalyzer 日志收集
  4. Qt 向word中插入文字(使用QAxWidget和QAxObject)
  5. 绘制FastMM内存分配流程图(小块内存分配)
  6. Delphi经典网站收藏
  7. (并查集)POJ 1308 & HDU 1325
  8. hdu 4034 Graph
  9. Java中替代C# ref/out 关键字方案:
  10. Android架构设计和软硬整合完整训练