為什麼虛擬函式不應該是內聯(inline)函式

  • 作者:由 匿名使用者 發表于 寵物
  • 2022-09-16

為什麼虛擬函式不應該是內聯(inline)函式匿名使用者2022.09.06 回答

常見的不能宣告為虛擬函式的有:普通函式(非成員函式)、靜態成員函式、內聯成員函式、建構函式、友元函式。1、為什麼C++不支援普通函式為虛擬函式? 普通函式(非成員函式)只能overload,不能被override,宣告為虛擬函式也沒有什麼意思,因此編譯器會在編譯時繫結函式。2、為什麼C++不支援建構函式為虛擬函式?這個原因很簡單,主要是從語義上考慮,所以不支援。因為建構函式本來是為了明確初始化物件成員才產生的,然而virtual function主要是為了在不完全瞭解細節的情況下也能正確處理物件。另外,虛擬函式是在不同型別的物件產生不同的動作,現在物件還沒有產生,如何使用虛擬函式來完成你想完成的動作。3、為什麼C++不支援靜態成員函式為虛擬函式? 靜態成員函式對於每個類來說只有一份程式碼,所有的物件都共享這一份程式碼,他不歸某個物件所有,所以他也沒有動態繫結的必要性。4、為什麼C++不支援內聯成員函式為虛擬函式? 其實很簡單,行內函數就是為了在程式碼中直接展開,減少函式呼叫話費的代價,虛擬函式是為了在繼承後物件能夠準確的執行自己的動作,這是不可能統一的。再說,inline函式在編譯時被展開,虛擬函式在執行時才能動態的繫結函式。5、為什麼C++不支援友元函式為虛擬函式?

為什麼虛擬函式不應該是內聯(inline)函式匿名使用者2018.09.21 回答

虛擬函式機制:在每一個有虛擬函式的類裡都有一個表VTABLE,存放虛擬函式地址

行內函數:編譯器把行內函數的程式碼存放在符號表中,每次呼叫會把函式程式碼插入到呼叫處,所以無法取得地址

二者相連繫:可以知道虛擬函式不能為行內函數,即使寫成內聯形式,編譯器也把它當成普通函式。但是如果是純虛擬函式,禁止寫成內聯形式。

Top