C 多型與虛函式面試題

2021-10-03 23:34:13 字數 1557 閱讀 8979

請你說一說你理解的虛函式和多型

多型的實現主要分為靜態多型和動態多型,靜態多型主要是過載,在編譯的時候就已經確定;動態多型是用虛函式機制實現的,在執行期間動態繫結

舉個例子:

乙個父類型別的指標指向乙個子類物件時候,使用父類的指標去呼叫子類中重寫了的父類中的虛函式的時候會呼叫子類重寫過後的函式。注意: 在父類中宣告為加了virtual關鍵字的函式,在子類中重寫時候不需要加virtual也是虛函式。

虛函式的實現:在有虛函式的類中,類的最開始部分是乙個虛函式表的指標,這個指標指向乙個虛函式表,表中放了虛函式的位址,實際的虛函式在**段(.text)中。當子類繼承了父類的時候也會繼承其虛函式表,當子類重寫父類中虛函式時候,會將其繼承到的虛函式表中的位址替換為重新寫的函式位址。使用了虛函式,會增加訪問記憶體開銷,降低效率。

簡述c++虛函式作用及底層實現原理

要點是要答出虛函式表和虛函式表指標的作用。c++中虛函式使用虛函式表和 虛函式表指標實現,虛函式表是乙個類的虛函式的位址表,用於索引類本身以及父類的虛函式的地 址,假如子類的虛函式重寫了父類的虛函式,則對應在虛函式表中會把對應的虛函式替換為子類的 虛函式的位址;虛函式表指標存在於每個物件中(通常出於效率考慮,會放在物件的開始位址處), 它指向物件所在類的虛函式表的位址;在多繼承環境下,會存在多個虛函式表指標,分別指向對應 不同基類的虛函式表。

乙個物件訪問普通成員函式和虛函式哪個更快

訪問普通成員函式更快,因為普通成員函式的位址在編譯階段就已確定,因此在訪問時直接調 用對應位址的函式,而虛函式在呼叫時,需要首先在虛函式表中尋找虛函式所在位址,因此相比普 通成員函式速度要慢一些

在什麼情況下,析構函式需要是虛函式

若存在類繼承關係並且析構函式中需要析構某些資源時,析構函式需要是虛函式,否則當使用父類指標指向子類物件,在delete時只會呼叫父類的析構函式,而不能呼叫子類的析構函式,造成記憶體洩露等問題

內聯函式、建構函式、靜態成員函式可以是虛函式嗎

都不可以。內聯函式需要在編譯階段展開,而虛函式是執行時動態繫結的,編譯時無法展開; 建構函式在進行呼叫時還不存在父類和子類的概念,父類只會呼叫父類的建構函式,子類呼叫子類 的,因此不存在動態繫結的概念;靜態成員函式是以類為單位的函式,與具體物件無關,虛函式是 與物件動態繫結的,因此是兩個不衝突的概念;

建構函式中可以呼叫虛函式嗎

可以,但是沒有動態繫結的效果,父類建構函式中呼叫的仍然是父類版本的函式,子類中呼叫的仍然是子類版本的函式

請你回答一下為什麼析構函式必須是虛函式,為什麼c++預設的析構函式不是虛函式

將可能會被繼承的父類的析構函式設定為虛函式,可以保證當我們new乙個子類,然後使用基類指標指向該子類物件,釋放基類指標時可以釋放掉子類的空間,防止記憶體洩漏。

c++預設的析構函式不是虛函式是因為虛函式需要額外的虛函式表和虛表指標,占用額外的記憶體。而對於不會被繼承的類來說,其析構函式如果是虛函式,就會浪費記憶體。因此c++預設的析構函式不是虛函式,而是只有當需要當作父類時,設定為虛函式。

C 面試題 多型,虛函式,純虛函式

多型 是對於不同物件接收相同訊息時產生不同的動作。c 的多型性具體體現在執行和編譯兩個方面 在程式執行時的多型性通過繼承和虛函式來體現 在程式編譯時多型性體現在函式和運算子的過載上 開課吧廣場c 面試 虛函式 在基類中冠以關鍵字 virtual 的成員函式。它提供了一種介面介面。允許在派生類中對基類...

虛函式面試題

classa classb int tmain intargc,tchar argv 情況a 不是虛函式 輸出hello world,程式執行正常 情況b 有虛函式 程式直接crash 原因是 不是虛函式的情況,this指標當成第乙個引數傳入函式 一般是通過ecx暫存器 主要裡面沒有使用這個this...

C 多型面試題

答 多型是物件導向的重要特性之一,它是一種行為的封裝,是同一種事物所表現出的多種形態,簡單地說是 乙個介面多種實現 有兩種型別的多型性 編譯時的多型性。編譯時的多型性是通過過載來實現的。執行時的多型性。執行時的多型性是通過虛成員實現的。1.從儲存空間角度。虛函式對應乙個vtable,這個vtable...