C 裡的建構函式為什麼不能為虛函式

2022-08-03 23:45:17 字數 397 閱讀 9000

以下**在編譯時會出錯,原因是建構函式不能為虛函式。

1

class

student 78

private:9

intdwno;

10 };

那麼建構函式為什麼不能為虛函式呢?

這裡你需要知道乙個概念,那就是虛函式表vtbl,每乙個擁有虛成員函式的類都有乙個指向虛函式表的指標。物件通過虛函式表裡儲存的虛函式位址來呼叫虛函式。

那虛函式表指標是什麼時候初始化的呢?當然是建構函式。當我們通過new來建立乙個物件的時候,第一步是申請需要的記憶體,第二步就是呼叫建構函式。試想,如果建構函式是虛函式,那必然需要通過vtbl來找到虛建構函式的入口位址,顯然,我們申請的記憶體還沒有做任何初始化,不可能有vtbl的。因此,建構函式不能是虛函式。

為什麼建構函式不能為虛函式

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

為什麼建構函式不能為虛函式

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

為什麼建構函式不能為虛函式

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