• 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()被遮掩了



  • 相关阅读:
    分布式爬虫
    前端页面展示
    fillter根据value来匹配字段
    element ui 怎么去修改el-date-picker的时间
    element ui,input框输入时enter健进行搜索
    element ui 里面的table怎么弹出一个框让表中数据点击出现弹框
    修改数据结构记录,将同级数据改成父子集数据
    h5的复制功能的使用,Clipboard.js的使用,主要是在app里面使用
    在安卓手机下按钮会悬浮在键盘上,怎么解决vue.js
    last-child为啥不生效
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5097737.html
Copyright © 2020-2023  润新知