Effective C++ Item 33 避免遮掩继承过来的名称
2023-09-14 09:08:01 时间
本文为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()被遮掩了
相关文章
- EasyC++28,const和指针
- C++和Java有哪些区别
- C++继承的基本语法与三种继承方式
- 前端vue面试题2020及答案_c++ 面试题
- 缓冲区刷新在 C++ 中意味着什么?
- C++ 菱形继承
- C++结构体和类的区别_c++有结构体吗
- 《安富莱嵌入式周报》第293期:SEGGER开源其C/C++库源码emRun,丰富EMC电磁兼容资,OTA开源组件,2022 Github全球报告,内存安全指南
- 【C++修炼之路】15.C++继承
- C++三种继承方式详解编程语言
- C++继承(详解版)
- C++ set初始化(STL set初始化)详解
- C++ showpoint操作符(详解版)
- C++继承和组合(无师自通)
- C++ cout格式化输出(输出格式)完全攻略
- Microsoft Visual C++ 2019 v14.26.28720.3 官方版
- 从C到MySQL汉字计算机编码的探索(c++ mysql 汉字)
- C++继承介绍
- C++中抽象类和接口的区别介绍
- 关于C++中虚拟继承的一些总结分析
- c++基础语法:虚继承
- C++输出斐波那契数列的两种实现方法
- C++设计类不能被继承的方法实例讲解
- C++求阶乘的两种方法
- C++实现二叉树遍历序列的求解方法
- C++继承中的访问控制实例分析
- C++多重继承和虚拟继承对象模型、效率分析
- VC++中内存对齐实例教程