實際應用中會發現虛函式在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
,在基類中和派生類中都可以這麼做。
如果是在派生類中,可以同時使用override
和final
識別符號。
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修飾類呢?只有當需要確保類中的所有方法都不被重寫時...