一、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-hk/n/370716.html
微信掃一掃
支付寶掃一掃