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

2021-07-02 04:37:01 字數 430 閱讀 7212

這個是為什麼在建構函式中不能呼叫虛函式的原因

.因為任何時候在基類中的虛函式呼叫

,都不可能到達子類的實現

,因為子類的虛表初始化是在呼叫完基類的構造之後發生的

. 因此在基類中呼叫虛函式永遠只能呼叫到自己的實現或者更基類的實現

,不可能跳轉到子類的實現

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

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

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

建構函式與析構函式中不呼叫虛函式

本文參考 effective c 第九條款 在c 中,提倡不能在建構函式和析構函式中呼叫虛函式。這是為什麼呢?首先,我們先回顧一下c 虛函式的作用。虛函式的引入是c 執行時多型的體現,通過呼叫虛函式可以在執行程式時實現動態繫結,體現了物件導向程式設計多型的思想。那為何提倡不能在建構函式與析構函式中不...

建構函式與析構函式中不呼叫虛函式

本文參考 effective c 第九條款 在c 中,提倡不能在建構函式和析構函式中呼叫虛函式。這是為什麼呢?首先,我們先回顧一下c 虛函式的作用。虛函式的引入是c 執行時多型的體現,通過呼叫虛函式可以在執行程式時實現動態繫結,體現了物件導向程式設計多型的思想。那為何提倡不能在建構函式與析構函式中不...

C 建構函式中呼叫虛函式

我們知道 c 中的多型使得可以根據物件的真實型別 動態型別 呼叫不同的虛函式。這種呼叫都是物件已經構建完成的情況。那如果在建構函式中呼叫虛函式,會怎麼樣呢?有這麼一段 class a virtual void func void test public int m ival class b publ...