C++的override關鍵字有什么作用?如何使用?

override 是 c++++11 引入的關鍵字,用于明確標識派生類中重寫的虛函數。1. 它的主要作用是告訴編譯器“我正在覆蓋基類的虛函數”,若覆蓋不正確則會觸發編譯錯誤;2. 使用方式是在派生類成員函數聲明后添加 override,如 void bar() override;;3. 注意事項包括:只能用于成員函數、必須在聲明處使用、函數簽名需與基類完全一致;4. 與 final 的區別在于 override 用于標記覆蓋行為,而 final 表示函數不可再被覆蓋或類不可再被繼承;5. 實際開發中建議所有虛函數重寫都加上 override,以提高可讀性、避免拼寫錯誤和參數不一致等問題,并利于重構時及時發現問題。

C++的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 不復雜,但容易忽略,特別是在新手代碼中。合理使用它,可以顯著提升代碼質量和健壯性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享