override 和 final 識別符號

2021-09-10 09:02:27 字數 1051 閱讀 1609

實際應用中會發現虛函式在c++中會引起很多問題,因為沒有乙個強制的機制來標識虛函式在派生類中被重寫了,virtual關鍵字並不是強制性的,這給**的閱讀增加了一些困難,因為你不得不去看繼承關係的最頂層以確認這個方法是不是虛方法。在派生類中使用virtual關鍵字會讓**更易讀但會出現一些不明顯的錯誤,示例:

class b }; 

class d : public b};

class d : public b

};

又一次,這兩個函式的關係是過載而非重寫,因此,如果你想通過b型別的指標來呼叫f(),程式會列印出b::f,而不是d::f。

c++中有一種方法可以來描述這種意圖,兩個新的、專門的識別符號(不是關鍵字):

第乙個例子會變成:

class b }; 

class d : public b

};

這段**會觸發乙個編譯錯誤(使用override識別符號嘗試第二個例子,也會得到相同的錯誤):d::f: 有override識別符號的函式並沒有重寫任何基類函式;另一方面,如果想要乙個函式永遠不能被重寫,可以把該函式標識為final,在基類中和派生類中都可以這麼做。

如果是在派生類中,可以同時使用overridefinal識別符號。

class b }; 

class d : public b};

class f : public d

};

final宣告的函式不能被f::f重寫。

總結:

1.final 修飾基類的虛函式不能被派生類重寫;

2.override 修飾派生類虛函式強制完成重寫,如果沒有重寫會編譯報錯。

final和override關鍵字

目前用的比較多的是override,主要是在派生類中重寫基類虛函式時。有助於加強 可讀性和減少一些拼寫錯誤。struct a struct b final a struct c b err b是final override關鍵字保證了派生類中宣告重寫的函式與基類虛函式有相同的簽名,可避免一些拼寫錯誤...

C 11中的override和final關鍵字

override 含義 被標識的函式需要強制重寫基類虛函式。class base class derived public base 原本想要在派生類重寫test函式,但是因為手抖新建了乙個teat函式,編譯器並不會報錯!為了避免上述手抖得情況,在派生類需要重寫的虛函式後面加上override關鍵字...

Final類和Final方法

終止繼承 final類 當關鍵字final用來修飾類時,其含義是該類不能在派生子類。換句話說,任何其他類都不能繼承用final修飾的類,即使該類的訪問限制為public型別,也不能被繼承 否則,將編譯報錯。可以繼承的其他類。什麼時候應該使用final修飾類呢?只有當需要確保類中的所有方法都不被重寫時...