轉 C 之虛函式不能定義成內聯函式的原因

2022-05-12 00:59:30 字數 1678 閱讀 5868

**:

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

一、內聯函式(inline)

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

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

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

編譯器需要把inline函式體替換到函式呼叫處,所以編譯器必須要知道inline函式的函式體是啥,所以要將inline函式的函式定義和函式宣告一起寫在標頭檔案中,便與編譯器查詢替換。

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

同乙個inline函式可以多處宣告和定義,但是必須要完全相同;

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

二、虛函式(virtual)

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

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

建構函式是為了構造物件的,所以在呼叫建構函式時候必然知道是哪個物件呼叫了建構函式,所以建構函式不能為虛函式。

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

類的靜態成員函式是該類共用的,與該類的物件無關,靜態函式裡沒有this指標,所以不能為虛函式。

虛函式不能定義為內聯函式的原因:

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

總結

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

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

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

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

編譯器需要把inline函式體替換到函式呼叫處,所以編譯器必須要知道inline函式的函式體是啥,所以要將inline函式的函式定義和函式宣告一起寫在標頭檔案中,便與編譯器查詢替換。

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

同乙個inline函式可以多處宣告和定義,但是必須要完全相同。

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

7.類的建構函式不能是虛函式。建構函式是為了構造物件的,所以在呼叫建構函式時候必然知道是哪個物件呼叫了建構函式,所以建構函式不能為虛函式。

8.類的靜態成員函式不能是虛函式。類的靜態成員函式是該類共用的,與該類的物件無關,靜態函式裡沒有this指標,所以不能為虛函式。

C 哪些函式不能宣告成虛函式

在c 有五種函式不能被宣告成虛函式,分別是 非成員函式 建構函式 靜態成員函式 內聯成員函式 友元函式這五種,下面分別解釋為什麼這五種函式不能被宣告成虛函式。1.非成員函式 非成員函式只能被過載 overload 不能被繼承 override 而虛函式主要的作用是在繼承中實現動態多型,非成員函式早在...

C 中析構函式定義成虛函式的原因

為什麼標準c 建議將虛構函式定義成虛函式,下面就來 這個問題。include class base base private char data class baseex public base baseex private char m data void main 很顯然,上述的程式有記憶體洩漏...

C 中析構函式定義成虛函式的原因

為什麼標準c 建議將虛構函式定義成虛函式,下面就來 這個問題。include class base base private char data class baseex public base baseex private char m data void main 很顯然,上述的程式有記憶體洩漏...