zoukankan      html  css  js  c++  java
  • 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()被遮掩了



  • 相关阅读:
    多层次子查询的sql执行顺序的问题
    RestTemplate不落地中转文件
    Gitbook从安装到使用【转】
    Linux离线安装依赖包技巧
    CentOS7 配置环境变量断开ssh后失效
    分页查询排序问题
    地图坐标的转换
    FeatureLayer图层的属性查询方式(query的使用方法)
    使用LayerView.effect进行点的高亮显示
    DQL + 排序
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5097737.html
Copyright © 2011-2022 走看看