Effective C++ Item 33 避免遮掩继承过来的名称
来源:互联网 发布:喜哥淘宝店铺 编辑:程序博客网 时间:2024/06/05 04:52
本文为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::mf1d.mf1(x); //error. 因为Derived::mf1遮掩了 Base::mf1d.mf2(); //ok. 调用 Base::mf2d.mf3(); //ok. 调用 Derived::mf3d.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::mf1d.mf1(x); //ok. Base::mf1d.mf2(); //ok. 调用 Base::mf2d.mf3(); //ok. 调用 Derived::mf3d.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::mf1d.mf1(x);//error. Base::mf1()被遮掩了
0 0
- Effective C++ Item 33 避免遮掩继承过来的名称
- Effective C++ 33 避免遮掩继承而来的名称
- 《Effective C++》学习笔记条款33 避免遮掩继承而来的名称
- Effective C++:条款33:避免遮掩继承而来的名称
- 读书笔记《Effective C++》条款33:避免遮掩继承而来的名称
- C++之避免遮掩继承而来的名称(33)---《Effective C++》
- 《Effective C++》读书笔记之item33:避免遮掩继承而来的名称
- 避免遮掩继承而来的名称(Effective C++_33)
- Effective C++条款33:避免遮掩继承而来的名称 实验示例
- Effective C++ 读书笔记 条款33:避免遮掩继承而来的名称
- Effective C++ 条款33:避免遮掩继承而来的名称
- 条款33:避免遮掩继承而来的名称
- 条款33:避免遮掩继承而来的名称
- 条款33:避免遮掩继承而来的名称
- 条款33:避免遮掩继承而来的名称
- 条款33----避免遮掩继承而来的名称
- 条款33:避免遮掩继承而来的名称
- 条款33:避免遮掩继承而来的名称
- CentOS6.4-X64下Hadoop-2.0.0-CHD4伪分布安装(单机)!
- PHP错误:Forbidden You don't have permission to access / on this server.
- 疯狂IOS学习--FKPrinter之纠正
- 如何选择移动广告平台
- C++ opencv快速例子学习——读图显示
- Effective C++ Item 33 避免遮掩继承过来的名称
- 9解析函数(三)
- 删除数据库时提示数据库正在被使用,无法删除(Cannot drop database databasename because it is currently in use)的问题
- iOS开发之Objective-C与JavaScript的交互
- java去除字符串空格
- java解析xml文件
- Binary Tree Preorder Traversal Java
- 分页存储过程
- 重复数据处理