首页 > 代码库 > Effective C++ Item 33 避免遮掩继承过来的名称
Effective C++ Item 33 避免遮掩继承过来的名称
本文为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()被遮掩了
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。