zoukankan      html  css  js  c++  java
  • c++ 子类切勿重新定义父类 non-virtual函数

    子类如果重新定义了父类的non-virtual函数则不会有多态效果。

    为方便描述,这里的方法和继承方式都用public。至于原因嘛,你懂的!

    1:子类直接继承父类方法

    class BaseOption
    {
    public:
        void Function();
    };
    
    void BaseOption::Function()
    {
        cout<<"BaseOption::Function()"<<endl;
    }
    
    
    
    class SubOption :
        public BaseOption
    {
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        SubOption obj;
        BaseOption *pBase = &obj;

     SubOption *pSub = &obj;

     pBase->Function();
     
    pSub->Function();
    }

    输出:

    "BaseOption::Function()"
    "BaseOption::Function()"

    这里使用BaseOption 和SubOption 调用Function都能调进BaseOption::Function();

    2:为了实现多态效果,把父类Function()改为virtual,在子类中重新实现

    class BaseOption
    {
    public:
        virtual void Function();
    };
    
    void BaseOption::Function()
    {
        cout<<"BaseOption::Function()"<<endl;
    }
    
    
    
    class SubOption :
        public BaseOption
    {
    public:
           void Function();
    };
    
    void SubOption::Function()
    {
      cout<<"SubOption::Function()"<<endl;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        SubOption obj;
        BaseOption *pBase = &obj;

     SubOption *pSub = &obj;

      pBase->Function();

     pSub->Function();
    }

    这就是我们常说的多态。

    输出:
    "SubOption::Function()"
    "SubOption::Function()"

    3:子类直接重新定义父类non-virtual方法,这背时的做法,在这种情况下就没有了多态属性,至于这种设计方法的弊端,没得说。

    class BaseOption
    {
    public:
        void Function();
    };
    
    void BaseOption::Function()
    {
        cout<<"BaseOption::Function()"<<endl;
    }
    
    
    
    class SubOption :
        public BaseOption
    {
    public:
           void Function();
    };
    
    void SubOption::Function()
    {
      cout<<"SubOption::Function()"<<endl;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        SubOption obj;
        BaseOption *pBase = &obj;
        SubOption *pSub = &obj;
        pBase->Function();
        pSub->Function();
    }

    输出:
    BaseOption::Function()

    SubOption::Function()

    虽然实例对象时SubOption obj,但在调用时候 由BaseOption指针pBase会调进BaseOption中,这也是哦,SubOption is-a BaseOption .

  • 相关阅读:
    Atom编辑器快捷键大全
    sql随机
    InnoDB表要建议用自增列做主键
    Nginx优化
    Nginx访问限速配置方法详解
    checking for known struct flock definition... configure: error: Don't know how to define struct flock on this system, set --enable-opcache=
    阿里巴巴技术质量新人手册4-研发过程中的测试工作
    阿里巴巴技术质量新人手册3-如何做到测试场景不遗漏
    阿里巴巴技术质量新人手册2-修炼测试基本功
    阿里巴巴技术质量新人手册1-测试开发工程师的角色
  • 原文地址:https://www.cnblogs.com/zhidao-chen/p/3835485.html
Copyright © 2011-2022 走看看