override 是 c++++11 引入的關鍵字,用于明確標識派生類中重寫的虛函數。1. 它的主要作用是告訴編譯器“我正在覆蓋基類的虛函數”,若覆蓋不正確則會觸發編譯錯誤;2. 使用方式是在派生類成員函數聲明后添加 override,如 void bar() override;;3. 注意事項包括:只能用于成員函數、必須在聲明處使用、函數簽名需與基類完全一致;4. 與 final 的區別在于 override 用于標記覆蓋行為,而 final 表示函數不可再被覆蓋或類不可再被繼承;5. 實際開發中建議所有虛函數重寫都加上 override,以提高可讀性、避免拼寫錯誤和參數不一致等問題,并利于重構時及時發現問題。
override 是 c++11 引入的一個上下文關鍵字,它本身不是一個真正的“保留關鍵字”,但用在特定語境下(比如虛函數重寫)時具有特殊含義。它的主要作用是明確地告訴編譯器:我正在覆蓋一個基類的虛函數。如果覆蓋不正確,編譯器會報錯。
明確意圖,避免錯誤
使用 override 最直接的好處是幫助開發者表達意圖。當你在一個派生類中寫了一個看起來像是重寫的方法,但其實并沒有真正覆蓋基類的虛函數時,沒有 override 的話,這個錯誤可能不會被立刻發現,而是埋下隱患。
舉個例子:
立即學習“C++免費學習筆記(深入)”;
class Base { public: virtual void foo(int x) {} }; class Derived : public Base { public: virtual void foo(double x) override {} // 編譯錯誤!因為Base里沒有接受double的foo虛函數 };
在這個例子里,Derived::foo(double) 并沒有真正覆蓋 Base::foo(int),加了 override 后,編譯器會立刻指出這個問題。
使用方式很簡單
你只需要在派生類的虛函數聲明后面加上 override 即可,通常是在頭文件中的函數聲明處使用:
class Base { public: virtual void bar() {} }; class Derived : public Base { public: void bar() override; // 在.h中聲明 }; // 在.cpp中實現 void Derived::bar() { // 實現邏輯 }
注意幾點:
- override 只能用于成員函數,不能用于普通函數。
- 它必須出現在函數的聲明處,而不是定義處。
- 函數簽名必須與基類完全匹配(包括 const 修飾符、參數類型等)。
和 final 的區別
有時候你會看到 final 也和 override 一起出現,它們雖然都是用來控制繼承行為的關鍵字,但用途不同:
- override:強調“我要覆蓋一個虛函數”。
- final:強調“這個函數不能再被覆蓋”或者“這個類不能再被繼承”。
例如:
class Base { public: virtual void func() = 0; }; class Derived : public Base { public: void func() override final { /* 這個函數之后無法再被子類覆蓋 */ } };
實際開發中的建議
在實際項目中,特別是大型項目或團隊協作中,強烈建議為所有重寫的虛函數都加上 override。這樣做有幾個好處:
一些常見的錯誤場景包括:
- 函數名拼錯,比如 draw() 寫成 draaw()
- 參數類型不一致,比如 int 和 size_t
- 忘記 const 修飾符
加了 override 以后,這些情況都會變成編譯期錯誤,而不是運行時隱藏問題。
基本上就這些。override 不復雜,但容易忽略,特別是在新手代碼中。合理使用它,可以顯著提升代碼質量和健壯性。