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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM