• 避免遮掩继承而来的名称


    public:
      virtual void mf1() = 0;
      virtual void mf1(int);

      virtual void mf2();

      void mf3();
      void mf3(double);

      ...

    };

    class Derived: public Base {
    public:
      virtual void mf1();
      void mf3();
      void mf4();
      ...
    };

    Derived d;
    int x;

    d.mf1();                   // fine, calls Derived::mf1
    d.mf1(x);                  // error! Derived::mf1 hides Base::mf1
    d.mf2();                   // fine, calls Base::mf2
    d.mf3();                   // fine, calls Derived::mf3
    d.mf3(x);                  // error! Derived::mf3 hides Base::mf3

    不管是不是virtual,也不管函数参数是否不同,父类的函数名称都被掩盖了

    解决办法:
    class Derived: public Base {
    public:
      using Base::mf1;       // make all things in Base named mf1 and mf3
      using Base::mf3;       // visible (and public) in Derived's scope
      virtual void mf1();
      void mf3();
      void mf4();
      ...
    };

    Derived d;
    int x;
    ...
    d.mf1();                 // still fine, still calls Derived::mf1
    d.mf1(x);                // now okay, calls Base::mf1
    d.mf2();                 // still fine, still calls Base::mf2
    d.mf3();                 // fine, calls Derived::mf3
    d.mf3(x);                // now okay, calls Base::mf3

     如果你继承base class并加上重载函数,而你又希望重定义或覆写其中一部分,那么你必须为那些原本会被遮掩的每个名称引入一个using声明,否则某些你希望继承的名称会被遮掩

  • 相关阅读:
    jQuery中jsonp的跨域处理,no access-control-allow-origin,unexpected token
    doT中嵌套for循环的使用
    c++ new带括号和不带括号
    python装饰器之使用情景分析
    Python中classmethod与staticmethod区别
    python作用域 scope
    duck type鸭子类型
    EAFP和LBYL 两种防御性编程风格
    c++重载、覆盖和隐藏
    c++ 名字粉碎(name mangling)
  • 原文地址:https://www.cnblogs.com/secbook/p/2655476.html
Copyright © 2020-2023  润新知