內聯函式 虛函式

2021-08-20 12:27:16 字數 976 閱讀 5500

在c++中,inline關鍵字和virtual關鍵字分別用來定義c++中的內聯函式和虛函式,他們在各自的場合都有其各自的應用,下面將簡單介紹他們各自的功能,然後在說明為什麼乙個函式不能同時是虛函式和內聯函式(inline)

內聯函式的目的是為了減少函式呼叫時間。它是把內聯函式的函式體在編譯器預處理的時候替換到函式呼叫處,這樣**執行到這裡時候就不需要花時間去呼叫函式。但內聯函式有個缺點是它會增加執行檔案大小。所以如果不適當的使用內聯函式會造成執行檔案特別大。

而使用內聯函式有以下幾點需要注意:

標頭檔案中不僅要包含inline函式的宣告,還要包含inline函式的定義

可以在同乙個專案的不同原始檔內定義函式名相同,實現相同的inline函式

定義在class宣告內的成員函式預設是inline函式

虛函式是為了實現多型特性的。虛函式的呼叫只有在程式執行的時候才能知道到底呼叫的是哪個函式,其是有有如下幾點需要注意:

類的建構函式不能是虛函式

類的靜態成員函式是虛函式

inline是在編譯器將函式類容替換到函式呼叫處,是靜態編譯的。而虛函式是動態呼叫的,在編譯器並不知道需要呼叫的是父

類還是子類的虛函式,所以不能夠inline宣告展開,所以編譯器會忽略

使用inline關鍵字的函式可能會被編譯器忽略而不在呼叫處展開,如虛函式。

如果定義的inline函式過大,為了防止生成的obj檔案太大,編譯器會忽略這裡的inline宣告

inline是在編譯器將函式類容替換到函式呼叫處,是靜態編譯的。而虛函式是動態呼叫的,在編譯器並不知道需要呼叫的是父類還是子類的虛函式,所以不能夠inline宣告展開,所以編譯器會忽略

標頭檔案中不僅要包含inline函式的宣告,還要包含inline函式的定義

可以在同乙個專案的不同原始檔內定義函式名相同,實現相同的inline函式

定義在class宣告內的成員函式預設是inline函式

類的建構函式不能是虛函式

類的靜態成員函式不能是虛函式

內聯虛函式詳解

當乙個函式是內聯和虛函式時,會發生 替換或使用虛表呼叫嗎?為了弄清楚內聯和虛函式,讓我們將它們分開來考慮。通常,乙個內聯函式是被展開的。class cfoo int setval int v 這裡,如果使用下列 cfoo x x.setval 17 int y x.getval 那麼編譯器產生的目標...

虛函式能否是內聯函式

內聯函式是在編譯時,將呼叫函式處插入內聯函式的 省去了函式呼叫時的開銷。虛函式是通過指標或引用呼叫函式時,通過虛函式表來確定呼叫的函式,在執行時確定。那麼虛函式是否可以是內聯函式?以前沒有想過這個問題,表面上看,虛函式不能為內聯函式。我們在類中定義的函式都是內聯函式,析構函式經常在類中定義,而析構函...

虛函式能否是內聯函式

內聯函式是在編譯時,將呼叫函式處插入內聯函式的 省去了函式呼叫時的開銷。虛函式是通過指標或引用呼叫函式時,通過虛函式表來確定呼叫的函式,在執行時確定。那麼虛函式是否可以是內聯函式?以前沒有想過這個問題,表面上看,虛函式不能為內聯函式。我們在類中定義的函式都是內聯函式,析構函式經常在類中定義,而析構函...