C++ 继承下的名称遮掩与重载
2012-11-17 16:52
323 查看
普通情况下,内层作用域的名称会遮掩外层作用域的名称,不管类型是否一致,只要名称相同,就会发生遮掩。
在类继承体系下,派生类的作用域内嵌于基类的作用于中。因此,派生类中的名称会遮掩基类中的名称,不管是什么类型的函数(pure virtual,impure virtual, non virtual),只要派生类中成员函数的名称与基类中成员函数名称一致,就会发生遮掩。由于基类的私有成员在派生类中无法直接访问,所以不存在遮掩为题。一下描述只适用于基类非私有成员情况。
若只想遮掩特定的基类成员函数或是对基类成员函数进行重载,必须使用using声明,如此只会遮掩函数原型相同(返回类型可不同)的基类成员函数。
也就是加了using声明,遮掩范围变小了
在类继承体系下,派生类的作用域内嵌于基类的作用于中。因此,派生类中的名称会遮掩基类中的名称,不管是什么类型的函数(pure virtual,impure virtual, non virtual),只要派生类中成员函数的名称与基类中成员函数名称一致,就会发生遮掩。由于基类的私有成员在派生类中无法直接访问,所以不存在遮掩为题。一下描述只适用于基类非私有成员情况。
class Base{ private: int x; proteced: virtual void mf1(double); void mf3(int); public: virtual void mf1() = 0; virtual void mf1(int); virtual void mf2(); void mf3(); void mf3(double); }; class Derived: public Base{ //也可以是private 或 protected 继承 private: int x; public: virtual void mf1(); // 遮掩Base所有mf1 void mf3(); // 遮掩Base所有mf3 void mf4(); };
若只想遮掩特定的基类成员函数或是对基类成员函数进行重载,必须使用using声明,如此只会遮掩函数原型相同(返回类型可不同)的基类成员函数。
class Base{ private: int x; proteced: virtual void mf1(double); void mf3(int); public: virtual void mf1() = 0; virtual void mf1(int); virtual void mf2(); void mf3(); void mf3(double); }; class Derived: public Base{ private: int x; public: using Base::mf1; using Base::mf3; virtual void mf1(); // 只遮掩Base::mf1() int mf3(); // 只遮掩Base::mf3(),注意,返回类型可不同 void mf4(); };
也就是加了using声明,遮掩范围变小了
相关文章推荐
- [effectiv c++]条款33:避免遮掩继承而来的名称(重载,重写,重定义)
- Effective_C++_条款三十三:避免遮掩继承而来的名称
- Effective C++ Item 33 避免遮掩继承过来的名称
- C++之避免遮掩继承而来的名称(33)---《Effective C++》
- Effective C++ Item 33 避免遮掩继承过来的名称
- C++继承中的名称遮掩
- 20180321 C++ 避免遮掩继承而来的名称
- 读书笔记_Effective_C++_条款三十三:避免遮掩继承而来的名称
- C++继承中的名称遮掩
- C++中继承技术引发的问题:重载(overload),覆盖(override)和隐藏(hide)的区别
- 谈C++继承中的重载、覆盖和隐藏
- [转载]C++继承中重载、重写、重定义的区别:
- 谈谈C++继承中的重载,覆盖和隐藏
- C++继承中的重载,覆盖和隐藏
- C/C++日常学习总结(第三篇)不能重载的运算符和不同基类继承产生的二义性
- C++中继承时的重载和重新定义
- [C++]重载、覆盖与继承
- C++继承-重载-多态-虚函数
- C++ 知识点(三):面向对象编程:类,对象,继承,重载
- 谈谈C++继承中的重载,覆盖和隐藏