c 虛函式描述符override

2021-06-22 00:01:51 字數 1542 閱讀 7098

在c++11中為了幫助程式設計師寫繼承結構複雜的型別,引入了虛函式描述符override,如果派生類在虛函式宣告時使用了override描述符,那麼該函式必須過載其基類中的同名函式,否則**將無法通過編譯。我們來看一下如**清單2-25所示的這個簡單的例子。

**清單2-25

struct base ;

struct derivedmid: public base ;

struct derivedtop : public derivedmid ;

// 編譯選項:g++ -c -std=c++11 2-10-3.cpp

在**清單2-25中,我們在基類base中定義了一些virtual的函式(介面)以及乙個非virtual的函式print。其派生類derivedmid中,基類的base的介面都沒有過載,不過通過注釋可以發現,derivedmid的作者曾經想要過載出乙個「void vneumann(double g)」的版本。這行注釋顯然迷惑了編寫derivedtop的程式設計師,所以derivedtop的作者在過載所有base類的介面的時候,犯下了3種不同的錯誤:

函式名拼寫錯,dijkstra誤寫作了dikjstra。

函式原型不匹配,vneumann函式的引數型別誤做了double型別,而dknuth的常量性在派生類中被取消了。

重寫了非虛函式print。

如果沒有override修飾符,

在**清單2-25中,derivedtop作者的4處可以編譯過去 但是與他的願意(想過載虛函式)有嚴重的偏差了 但是編譯器不報錯,繼續編譯下去 這樣就難排查了。

加上關鍵字

override 這樣編譯器可以輔助檢查是不是正確過載 。

如果沒有override修飾符 

derivedtop的作者可能在編譯後都沒有意識到自己犯了這麼多錯誤。因為編譯器對以上3種錯誤不會有任何的警示。這裡override修飾符則可以保證編譯器輔助地做一些檢查。我們可以看到,在**清單2-25中,derivedtop作者的4處錯誤都無法通過編譯。

此外,值得指出的是,在c++中,如果乙個派生類的編寫者自認為新寫了乙個介面,而實際上卻過載了乙個底層的介面(

一些簡單的名字如get、set、print就容易出現這樣的狀況

),出現這種情況編譯器還是愛莫能助的。不過這樣無意中的過載一般不會帶來太大的問題,因為派生類的變數如果呼叫了該介面,除了可

能存在的一些虛函式開銷外

,仍然會執行派生類的版本。因此編譯器也就沒有必要提供檢查「非過載」的狀況。而檢查「一定過載」的override關鍵字,對程式設計師的實際應用則會更有意義。

還有值得注意的是,如我們在第1章中提到的,final/override也可以定義為正常變數名,只有在其出現在函式後時才是能夠控制繼承/派生的關鍵字。通過這樣的設計,很多含有final/override變數或者函式名的c++98**就能夠被c++編譯器編譯通過了。但出於安全考慮,建議讀者在c++11**中應該盡可能地避免這樣的變數名稱或將其定義在巨集中,以防發生不必要的錯誤。

建議:如果派生類裡面是像過載虛函式 就加上關鍵字override 這樣編譯器可以輔助檢查是不是正確過載,如果沒加這個關鍵字 也沒什麼嚴重的error 只是少了編譯器檢查的安全性

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符,open 函式

一 檔案io學習大綱。1 檔案io概念 檔案概念 檔案型別。2 訪問檔案方法一 系統io 開啟?讀取?寫入?關閉?3 系統io檔案描述符概念?檔案描述符與檔案的關係?檔案描述符的值。4 檔案偏移量概念。5 系統io應用例項 lcd液晶 觸控螢幕。6 系統io另外一種訪問檔案的方式 記憶體對映。針對l...

C語言 檔案描述符

以下程式為linux或unix平台下 例 int f1,f2 f1 open test1 o rdonly,0 close f1 f2 open test2 o rdonly,0 printf f2 d n f2 最後應該輸出什麼?f1,f2代表的是檔案描述符,unix程序從生命週期開始時,開啟的描...