一、override關鍵字是什麼?
override關鍵字,是C++11標準引進的一種新特性,它可以用來強制子類重寫父類虛函數。在子類中使用override關鍵字,聲明子類中的函數重寫了父類中的虛函數。C++編譯器會在編譯時檢查虛函數的重寫是否正確,在代碼出現錯誤時會讓編譯器直接報錯。
class Base { public: virtual void foo() { std::cout << "Base foo." << std::endl; } }; class Derived : public Base { public: void foo() override { // 子類重寫父類虛函數 std::cout << "Derived foo." << std::endl; } };
二、override關鍵字的作用
override關鍵字有兩個作用:
第一,override可以讓編譯器在編譯時檢查子類是否正確地重寫了父類的虛函數。
第二,若子類沒有正確地重寫了父類的虛函數,編譯器會產生一個錯誤提示。這個錯誤是在編譯時檢查的,因此可以避免在運行時出現問題。
三、override的使用範圍
override關鍵字只能用於虛函數的重寫,不能用於非虛函數或靜態函數的重載。
class Base { public: virtual void foo() { std::cout << "Base foo." << std::endl; } void bar() { std::cout << "Base bar." << std::endl; } }; class Derived : public Base { public: void foo() override { // 子類重寫父類虛函數 std::cout << "Derived foo." << std::endl; } void bar() override { // 錯誤示範,不是虛函數不能重寫 std::cout << "Derived bar." << std::endl; } };
四、override的一些注意事項
1、如果父類的虛函數是純虛函數,子類必須實現這個虛函數,此時可以將子類中的虛函數定義成純虛函數。
class Base { public: virtual void foo() = 0; // 純虛函數 }; class Derived : public Base { public: void foo() override { // 子類必須實現純虛函數 std::cout << "Derived foo." << std::endl; } };
2、override關鍵字必須在虛函數的聲明和定義中都使用才會起作用。如果只在虛函數的聲明或定義中使用override關鍵字,編譯是會出現錯誤的。
class Base { public: virtual void foo(); }; class Derived : public Base { public: void foo() override; // 聲明中使用override關鍵字 }; void Derived::foo() { // 定義中沒有使用override關鍵字,編譯錯誤 std::cout << "Derived foo." << std::endl; }
3、override關鍵字只能用於派生類對基類的虛函數的重寫,不能用於基類內部重載的函數之間。
class Base { public: virtual void foo(int a); virtual void foo(float b); }; class Derived : public Base { public: void foo(int a) override; // 子類重寫父類中的foo(int) void foo(float b) override; // 子類重寫父類中的foo(float) void foo(double c); // 新增函數,不是虛函數,不會觸發override關鍵字 };
五、總結
在繼承中使用override關鍵字可以強制派生類對基類中相同簽名的虛函數進行重寫。override關鍵字的使用可以提高程序的健壯性,可以避免在運行時出現一些難以調試的問題。注意使用override關鍵字時需要滿足一些條件。
原創文章,作者:CDOWR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/370716.html