成員函式既是inline又是virtual型別

2021-06-26 07:36:16 字數 654 閱讀 9266

inline型別表示在編譯時期進行函式展開,用函式體在函式呼叫出代替函式的呼叫;而vitual是c++多型的必要條件,但是要想表現出多型,必須要等到執行時,才知道真正呼叫的是哪乙個函式。表面上看這兩個關鍵字如果同時使用,會產生錯誤,但不會的。

先簡單說一下虛表的機制:多型的實現是由虛表加以支援的,凡是有虛函式的物件,都會在建構函式開始時構造乙個虛表,虛表中的第乙個元素一般是物件的型別資訊,其他每個元素存放的是真正函式的位址,如果子類覆蓋了父類的虛函式,則對應的位置中的位址就會被修改,但是同乙個函式在虛表中的位置即下標是相同的。當我們用基類指標或者引用呼叫乙個虛函式時,在編譯期只知道該函式在某個虛表的第幾個位置,但是不知道是父類的虛表還是子類的虛表,只有到執行時才能確定是哪乙個虛表,從而表現出多型。但如果你不是使用基類的指標或者引用呼叫虛函式,或者你呼叫的不是虛函式,則在編譯期間就可以直接找到成員函式的位址,不需要等到執行時才確定,因為此時,呼叫者是哪個物件已經確定,從而該函式的位址也是確定的。

根據上面的描述,雖然virtual所代表的多型型別是要在執行時確定的,但是如果呼叫者不是基類的指標或者引用,則該virtual的位址會在編譯期間就確定,因而此時可以用inline進行展開。即使使用了基類的指標或引用進行呼叫,也不會產生錯誤,此時inline將不會展開,但virtual仍然表現出多型,因為inline畢竟只是建議,而不是強制,所以兩者不矛盾。

inline函式和virtual函式有著本質的區別

inline函式和virtual函式有著本質的區別,inline函式是在程式被編譯時就展開,在函式呼叫處用整個函式體去替換,而virtual函式是在執行期才能夠確定如何去呼叫的,因而inline函式體現的是一種編譯期機制,virtual函式體現的是一種執行期機制。因此,內聯函式是個靜態行為,而虛函式...

inline成員函式

一 用inline宣告的函式相當 define的作用,即用函式內容內建到程式中,這樣可以減少系統呼叫所花費的時間,特別是對於頻繁呼叫的函式,應該宣告為inline。但函式體太大的話,一般不宣告為inline。二 如果在類體中定義的成員函式,且函式體內沒有迴圈等控制結構,c 系統會自動將它作為inli...

inline 成員函式

呼叫函式時需要一定的時間和空間的開銷。c 提供一種提高效率的方法,即在編譯時將所呼叫函式的 直接嵌入到主調函式中,而不是將流程轉出去。這種嵌入到主調函式中的函式稱為 內建函式 inline function 又稱內嵌函式 在有些書中把它譯成 內聯函式 指定內建函式的方法很簡單,只需在函式首行的左端加...