看了這個,說得挺多,簡摘幾句,便足可以說明問題
虛函式對應乙個vtable,這個vtable其實是儲存在物件的記憶體空間的。若建構函式是虛的,就需要通過vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有。vtbl在構造函式呼叫後才建立。
建構函式的作用是提供初始化,在物件生命期只執行一次,不是物件的動態行為,也沒有太大的必要成為虛函式。
當乙個建構函式被呼叫時,它做的首要的事情之一是初始化它的vptr。因此,它只能知道它是「當前」類的,而完全忽視這個物件後面是否還有繼承者。 當編譯器為這個建構函式產生**時,它是為這個類的建構函式產生**,而非基類或派生類(因為類不知道誰繼承它)。
故而它使用的vptr必須是對於這個類的vtbl。而且,只要它是最後的構造函式呼叫,那麼在這個物件的生命期內, vptr將保持被初始化為指向這個vtbl。但如果接著還有乙個更晚派生的建構函式被呼叫,這個建構函式又將設定vptr指向它的vtbl等。直到最後的建構函式結束。vptr的狀態是由被最後呼叫的建構函式確定的。這就是為什麼構造函式呼叫是從基類到更加派生類順序的另乙個理由。
然而,當這一系列構造函式呼叫正發生時,每個建構函式都已經設定vptr指向它自己的vtbl。如果函式呼叫使用虛機制,它將只產生通過它自己的vtbl呼叫,而不是最後的vtbl(所有建構函式被呼叫後才會有最後的vtbl)。
參考:《c++ 中「有返回值」的「虛」建構函式》
建構函式不能是虛函式
最近有人問建構函式能不能是虛函式 當然不能 解釋一下 1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?...
建構函式能不能是虛函式
最近有人問建構函式能不能是虛函式 當然不能 解釋一下 1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?...
建構函式能不能是虛函式
最近有人問建構函式能不能是虛函式 當然不能 解釋一下 1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?...