1. 程式人生 > 其它 >面試題(一)

面試題(一)

面試題(一)

請你來說一下靜態函式和虛擬函式的區別:

靜態函式在編譯的時候就已經確定執行時機,虛擬函式在執行的時候動態繫結。虛擬函式因為用了虛擬函式表機制,呼叫的時候會增加一次記憶體開銷

請你來說一說過載和覆蓋:

過載:兩個函式名相同,但是引數列表不同(個數,型別),返回值型別沒有要求,在同一作用域中;
重寫:子類繼承了父類,父類中的函式是虛擬函式,在子類中重新定義了這個虛擬函式,這種情況是重寫。

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

多型的實現主要分為靜態多型和動態多型,靜態多型主要是過載,在編譯的時候就已經確定;動態多型是用虛擬函式機制實現的,在執行期間動態繫結。舉個例子:一個父類型別的指標指向一個子類物件時候,使用父類的指標去呼叫子類中重寫了的父類中的虛擬函式的時候,會呼叫子類重寫過後的函式,在父類中宣告為加了virtual關鍵字的函式,在子類中重寫時候不需要加virtual也是虛擬函式。
虛擬函式的實現:在有虛擬函式的類中,類的最開始部分是一個虛擬函式表的指標,這個指標指向一個虛擬函式表,表中放了虛擬函式的地址,實際的虛擬函式在程式碼段(.text)中。當子類繼承了父類的時候也會繼承其虛擬函式表,當子類重寫父類中虛擬函式時候,會將其繼承到的虛擬函式表中的地址替換為重新寫的函式地址。使用了虛擬函式,會增加訪問記憶體開銷,降低效率。

雪兒言