zoukankan      html  css  js  c++  java
  • override关键字

    https://www.cnblogs.com/xinxue/p/5471708.html

    2  重写 (override)

      在 1.2.2 中提到 override 关键字,可以避免派生类中忘记重写虚函数的错误

      下面以重写虚函数时,容易犯的四个错误为例,详细阐述之

    复制代码
    class Base {
    public:
        virtual void mf1() const;
        virtual void mf2(int x);
        virtual void mf3() &;
        void mf4() const;    // is not declared virtual in Base
    };
    
    class Derived: public Base {
    public:
        virtual void mf1();        // declared const in Base, but not in Derived.
        virtual void mf2(unsigned int x);    // takes an int in Base, but an unsigned int in Derived
        virtual void mf3() &&;    // is lvalue-qualified in Base, but rvalue-qualified in Derived.
        void mf4() const;        
    };
    复制代码

      在派生类中,重写 (override) 继承自基类成员函数的实现 (implementation) 时,要满足如下条件:

      一虚:基类中,成员函数声明为虚拟的 (virtual)

      二容:基类和派生类中,成员函数的返回类型和异常规格 (exception specification) 必须兼容

      四同:基类和派生类中,成员函数名、形参类型、常量属性 (constness) 和 引用限定符 (reference qualifier) 必须完全相同

      如此多的限制条件,导致了虚函数重写如上述代码,极容易因为一个不小心而出错

      C++11 中的 override 关键字,可以显式的在派生类中声明,哪些成员函数需要被重写,如果没被重写,则编译器会报错。

    复制代码
    class Derived: public Base {
    public:
        virtual void mf1() override;
        virtual void mf2(unsigned int x) override;
        virtual void mf3() && override;
        virtual void mf4() const override;
    };
    复制代码

      这样,即使不小心漏写了虚函数重写的某个苛刻条件,也可以通过编译器的报错,快速改正错误

    复制代码
    class Derived: public Base {
    public:
        virtual void mf1() const override;  // adding "virtual" is OK, but not necessary
        virtual void mf2(int x) override;
        void mf3() & override;
        void mf4() const override; 
    }; 
    复制代码

    小结:

    1)  公有继承

      纯虚函数      => 继承的是:接口 (interface)

      普通虚函数   => 继承的是:接口 + 缺省实现 (default implementation)

      非虚成员函数 =>继承的是:接口 + 强制实现 (mandatory implementation)

    2)  不要重新定义一个继承自基类的非虚函数 (never redefine an inherited non-virtual function)

    3)  在声明需要重写的函数后,加关键字 override

  • 相关阅读:
    HTTP协议简介
    Web开发中B/S架构和C/S架构的区别
    软件测试作业三
    Java8 时间处理
    Java EE
    Java 中的 I/O 抽象
    Python 高级 I/O 多路复用
    SQL 与关系代数
    Python 协程与事件循环
    Java SE 5.0
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/11089118.html
Copyright © 2011-2022 走看看