1. 程式人生 > >解構函式為什麼不能宣告為虛擬函式?解構函式為什麼要宣告為虛擬函式

解構函式為什麼不能宣告為虛擬函式?解構函式為什麼要宣告為虛擬函式

多型中的虛擬函式表是在執行時建立的還是編譯時建立的?

答:虛擬函式表在編譯的時候就確定了,而類物件的虛擬函式指標vptr是在執行階段確定的,這是實現多型的關鍵

(類的函式的呼叫並不是在編譯時就確定的,而是在執行時才確定的,由於編寫程式碼的時候並不能確定被呼叫的是基類的函式還是哪個派生類的函式,所以宣告為虛擬函式。虛擬函式和虛擬函式表是兩個不同的東西,虛擬函式的呼叫是在執行時才確定的,虛擬函式表是在編譯時就已經確定的了 。)

 

為什麼建構函式不能宣告為虛擬函式?

1.建立一個物件必須明確指出它的型別,否則無法建立,一個物件建立成功編譯器獲得它的實際型別,然後去呼叫對應的函式,而如果建構函式宣告為虛擬函式,會形成一個死鎖,虛擬函式是在執行才能確定確定其呼叫哪一個型別的函式,而具體哪一個型別是編譯器通過物件的型別去確定的,但是此時物件還未建立也就沒法知道其真實型別。

2.虛擬函式對應一張虛擬函式表,這個虛擬函式表是儲存在物件的記憶體空間的,如果建構函式是虛擬函式就需要通過虛擬函式表來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,找不到虛擬函式表,所以建構函式是不能宣告為虛擬函式的。