虛函數的作用,爲什麼構造函數不能是虛函數——金山面試


   第一,在概念上,構造函數的工作是把對象變成存在物。在任何構造函數中,對象可能只是部分被形成—我們只能知道基類已被初始化了,但不知道哪個類是從這個基類繼承來的。然而,虛函數是“向前”和“向外”進行調用。它能調用在派生類中的函數。如果我們在構造函數中也這樣做,那麼我們所調用的函數可能操作還沒有被初始化的成員,這將導致災難的發生。
   

   第二,。當一個構造函數被調用時,它做的首要的事情之一是初始化它的VPTR。因此,它只能知道它是“當前”類的,而完全忽視這個對象後面是否還有繼承者。當編譯器爲這個構造函數產生代碼時,它是爲這個類的構造函數產生代碼--既不是爲基類,也不是爲它的派生類(因爲類不知道誰繼承它)。
所以它使用的VPTR必須是對於這個類的VTABLE。而且,只要它是最後的構造函數調用,那麼在這個對象的生命期內,VPTR將保持被初始化爲指向這個VTABLE。但如果接着還有一個更晚派生的構造函數被調用,這個構造函數又將設置VPTR指向它的VTABLE,等.直到最後的構造函數結束。VPTR的狀態是由被最後調用的構造函數確定的。這就是爲什麼構造函數調用是從基類到更加派生類順序的另一個理由。
   

    但是,當這一系列構造函數調用正發生時,每個構造函數都已經設置VPTR指向它自己的VTABLE。如果函數調用使用虛機制,它將只產生通過它自己的VTABLE的調用,而不是最後的VTABLE(所有構造函數被調用後纔會有最後的VTABLE)。
另外,許多編譯器認識到,如果在構造函數中進行虛函數調用,應該使用早捆綁,因爲它們知道晚捆綁將只對本地函數產生調用。無論哪種情況,在構造函數中調用虛函數都沒有結果。
    所以,構造函數不能是虛的,然而,對於析構函數來說他常常是,而且最好是虛的!這個此處暫時不議.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章