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



  • 相关阅读:
    javascript 作用域、预解析、变量提升
    用最简洁代码实现indexOf方法
    JavaScript 中的 RegExp 对象
    不能使用任何循环控制语句和迭代器的情况下实现一个0到1000的数组赋值
    IDEA搭建SSM框架教程 从零开始 SSM+Maven框架搭建教程
    Redis缓存 集成SSM框架
    JavaWeb拦截器
    log4j.properties配置文件
    C#WinForm,TCP调试工具
    C#如何实现控件移动拖动
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5097737.html
Copyright © 2011-2022 走看看