1. 程式人生 > >C++建構函式中不呼叫虛擬函式的原因

C++建構函式中不呼叫虛擬函式的原因

今天在看網上一篇帖子的時候看到這個問題,試講關於C++物件虛擬函式表和型別資訊的(RTTI)的,正好看到了如下內容:

這個是為什麼在建構函式中不能呼叫虛擬函式的原因 .因為任何時候在基類中的虛擬函式呼叫,都不可能到達子類的實現,因為子類的虛表初始化是在呼叫完基類的構造之後發生的因此在基類中呼叫虛擬函式永遠只能呼叫到自己的實現或者更基類的實現,不可能跳轉到子類的實現.

也就是說,如果你本類的建構函式中呼叫了虛擬函式,那麼也只能呼叫到你本類和你上層基類中的虛擬函式,而不可能調到你派生類中的虛擬函式實現。

因為建構函式的呼叫要麼是new一個本類物件,要不就是在new派生類的時候呼叫你本類的建構函式。

而在派生類中呼叫你本類建構函式的時候,該類(派生類)物件的虛擬函式表指標還只是指向了基類(也就是你寫的類)的虛擬函式表,因此,通過該虛擬函式表,你無法呼叫到派生類物件自己的虛擬函式,只有到基類建構函式完成的以後,虛擬函式表的指標才指向到派生類的自己的虛擬函式表。

附上原文地址:http://blog.sina.com.cn/s/blog_41299a970101fzfz.html