C++11標準提供了說明符final。須要注意的是,C++11中的final不是關鍵字,而是說明符,這意味着您能夠將它(在不引發混淆的狀況下)將它做爲標識符使用(爲了兼容之前的代碼)。相似的說明符還有override。Java和AS3.0關鍵字final有「這是沒法改變的」或者「終態的」含義,它能夠修飾非抽象類、非抽象類成員方法和變量。你可能出於兩種理解而須要阻止改變:設計或效率。ios
C++11標準提供了說明符final,用於阻止派生類覆蓋特定的虛方法。或是阻止一個類成爲基類。編程
語法1:class Someclass final {...};編程語言
語法2:class Someclass {...type somefun(arg-list) final;...};ide
舉例以下:函數
#include <iostream> class X { private: char c; public: X():c('B'){} X(char arg):c(arg){} virtual void put()const final{std::cout<<c<<std::endl;} //final修飾了put()函數,使其不能被覆蓋 //... }; class Y:public X { private: int i; public: Y():i(0){} Y(int arg):i(arg){} //這裏不能有void put();了,由於有了final說明符 //... }; class Z final //final修飾Z類,您不能從Z類派生出一個類,而只能用於建立對象 { private: double d; public: Z():d(0.0){} Z(double arg):d(arg){} void put()const{std::cout<<d<<std::endl;} //... }; int main() { using namespace std; char final='X';//能夠這麼作 X x(final); x.put();//輸出 X Y y; y.put();//輸出 B Z z(3.14159); z.put();//輸出3.14159 return 0; }
一、final類spa
final類不能被繼承,所以final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,若是這個類不須要有子類,類的實現細節不容許改變,而且確信這個類不會再被擴展,那麼就設計爲final類。 final方法不能被子類的方法覆蓋,但能夠被繼承。設計
二、final方法code
若是一個類不容許其子類覆蓋某個方法,則能夠把這個方法聲明爲final方法。對象
使用final方法的緣由有二:繼承
第1、把方法鎖定,防止任何繼承類修改它的意義和實現。
第2、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提升執行效率。
三、final變量(常量)
用final修飾的成員變量表示常量,只能被賦值一次,賦值後值沒法改變!
final修飾的變量有三種:靜態變量、實例變量和局部變量,分別表示三種類型的常量。
從下面的例子中能夠看出,一旦給final變量初值後,值就不能再改變了。
另外,final變量定義的時候,能夠先聲明,而不給初值,這種變量也稱爲final空白,不管什麼狀況,編譯器都確保空白final在使用以前必須被初始化。可是,final空白在final關鍵字final的使用上提供了更大的靈活性,爲此,一個類中的final數據成員就能夠實現依對象而有所不一樣,卻有保持其恆定不變的特徵。
四、final參數
當函數參數爲final類型時,你能夠讀取使用該參數,可是沒法改變該參數的值。
注:父類的private成員方法是不能被子類方法覆蓋的,所以private類型的方法默認是final類型的。
final不能用於修飾構造方法。
示例:
public void f1(final int i){ } //i是final類型的,值不容許改變的.