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

來源:互聯網
上載者:User

1,從儲存空間角度

    虛函數對應一個vtable,這大家都知道,可是這個vtable其實是儲存在對象的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來調用,可是對象還沒有執行個體化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函數。

2,從使用角度

        虛函數主要用於在資訊不全的情況下,能使重載的函數得到對應的調用。建構函式本身就是要初始化執行個體,那使用虛函數也沒有實際意義呀。所以建構函式沒有必要是虛函數。

虛函數的作用在於通過父類的指標或者引用來調用它的時候能夠變成調用子類的那個成員函數。而建構函式是在建立對象時自動調用的,不可能通過父類的指標或者引用去調用,因此也就規定建構函式不能是虛函數。

3、建構函式不需要是虛函數,也不允許是虛函數,因為建立一個對象時我們總是要明確指定對象的類型,儘管我們可能通過實驗室的基類的指標或引用去訪問它。但析構卻不一定,我們往往通過基類的指標來銷毀對象。這時候如果解構函式不是虛函數,就不能正確識別物件類型從而不能正確調用解構函式。

4、從實現上看,vbtl在建構函式調用後才建立,因而建構函式不可能成為虛函數 

  從實際含義上看,在調用建構函式時還不能確定對象的真實類型(因為子類會調父類的建構函式);而且建構函式的作用是提供初始化,在對象生命期只執行一次,不是對象的動態行為,也沒有太大的必要成為虛函數

5、當一個建構函式被調用時,它做的首要的事情之一是初始化它的V P T R。因此,它只能知道它是“當前”類的,而完全忽視這個對象後面是否還有繼承者。當編譯器為這個建構函式產生代碼時,它是為這個類的建構函式產生代碼- -既不是為基類,也不是為它的衍生類別(因為類不知道誰繼承它)。

        所以它使用的V P T R必須是對於這個類的V TA B L E。而且,只要它是最後的建構函式調用,那麼在這個對象的生命期內, V P T R將保持被初始化為指向這個V TA B L E, 但如果接著還有一個更晚派生的建構函式被調用,這個建構函式又將設定V P T R指向它的 V TA B L E,等.直到最後的建構函式結束。V P T R的狀態是由被最後調用的建構函式確定的。這就是為什麼建構函式調用是從基類到更加派生 類順序的另一個理由。

        但是,當這一系列建構函式調用正發生時,每個建構函式都已經設定V P T R指向它自己的 V TA B L E。如果函數調用使用虛機制,它將只產生通過它自己的V TA B L E的調用,而不是最後的V TA B L E(所有建構函式被調用後才會有最後的V TA B L E)。

 

轉自:

http://blog.sina.com.cn/s/blog_620882f401016ri2.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.