zoukankan      html  css  js  c++  java
  • 派生类遮掩基类方法的一些总结

    参考:effective c++ 第三版 条款33 避免遮掩继承而来的名称。

    首先说下覆盖和重载的概念.  参考: http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html

    重载:指的是在同一个作用域内(这里提到了作用域scopes的概念,我的理解是函数或变量生效的范围),函数  名字相同,而参数个数或类型不同。 注意,重载与函数返回值无关。
    覆盖:指的是子类重写或者隐藏基类的一些方法。这里的方法位于不同的作用域。 个人理解覆盖不是多态的一种,与有无virtual关键字无关。
      class Base                                             class Derived :public Base
    {                                                            {
    void fun1(int, int );                                   void  fun1();
    virtual void fun2();                                  virtual  void fun2();  
    virtual void  fun2(int);                                                                   
    } ;                                                                 } ;
                                                                       
     
    如上所示,Derived继承了Base。当发生如下代码时,
      Derived d;
      int x;
      int y;
    d.fun1(); //right  
    d.fun1(x,y);// error  子类覆盖了父类中的fun1(int ,int ),当编译器看到这个函数时,首先在Derived的作用域内找, //并且找到了,但是参数不匹配,这时候编译器并不会继续扩大搜索范围,而是报错。
    d.fun2(); //right
    d.fun2(x); //error
    如果必须使用父类的方法,而子类又要有自己的重写, 及想完成上面的调用。可以使用 using 声明式。
     
      class Base                                             class Derived :public Base
    {                                                            {
                                                                          using Base::fun1;  //让Base class 中的所有fun1 均在Derived作用域                                                                                                     //内可见
    void fun1(int, int );                                   void  fun1();
    virtual void fun2();                                  virtual  void fun2();  
    virtual void  fun2(int);                                                                   
    } ;                                                                 } ;
     
    个人理解,从作用域这个角度理解覆盖的概念更加容易一些。
    最后Scott Meyers 总结两点:
     1.derived class 中的名称会遮掩base class 中的名称。
    2. 为了让被遮掩的名称重见天日,可以使用using声明式或转交函数(具体参考effective c++)。
    ~~~~~
  • 相关阅读:
    android开发之重写Application类
    android开发之Parcelable使用详解
    android开发之Bundle使用
    android开发之gridlayout使用入门
    android开发之merge结合include优化布局
    android开发布局优化之ViewStub
    android开发之PreferenceScreen使用详解
    android开发之使用Messenger实现service与activity交互
    LeetCode All in One 题目讲解汇总(持续更新中...)
    JavaWeb知识点总结
  • 原文地址:https://www.cnblogs.com/missmzt/p/4678243.html
Copyright © 2011-2022 走看看