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