建構函式可以為虛函式嗎?

2021-08-08 17:15:37 字數 395 閱讀 4498

答案當然是否定的,主要從一下兩個角度加以說明。

從儲存空間角度

虛函式對應乙個vtable,可是這個vtable其實是儲存在物件的記憶體空間的。

那麼問題來了,如果建構函式是虛函式,就要通過vtable來呼叫,可是物件空間還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。

從使用角度

虛函式主要用於在資訊不全的情況下,能夠使過載的函式得到對應的呼叫。建構函式本身就是要初始化例項,那使用虛函式也沒有實際意義。

另外,虛函式的作用在於通過父類的指標或者引用來呼叫它的時候能夠變成呼叫子類的那個成員函式,從而實現多型,也就是實現「乙個介面,多種方法」。而建構函式是在建立物件時自動呼叫的,不可能通過父類的指標或者引用去呼叫,因此規定建構函式不能是虛函式。

建構函式為什麼不可以為虛函式

1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。2,從使用角度 虛函式主要用...

析構函式為何可以為虛函式?

首先要明確 1.每個析構函式 不加 virtual 只負責清除自己的成員。2.可能有基類指標,指向的確是派生類成員的情況。這是很正常的 那麼當析構乙個指向派生類成員的基類指標時,程式就不知道怎麼辦了。所以要保證執行適當的析構函式,基類中的析構函式必須為虛析構。基類指標可以指向派生類的物件 多型性 如...

Create為什麼可以為虛函式?

今天乙個好友在群裡問 在vcl庫里,大多數建構函式是virtual的,這是為啥 按理,在呼叫建構函式之前,物件都還沒有,當然也應該沒有vtbl,那麼這樣virtual有什麼意義呢?所以c 裡的建構函式沒有virtual的。難道delphi裡不是醬紫地?那麼vtbl是在什麼時候被初始化的?首先,為什麼...