提到建構函式和析構函式,想必大家肯定是非常了解,但是能否在建構函式或是析構函式中呼叫虛函式呢?
答案是千萬不要這麼做,這麼做不會得到大家想要的結果。
首先提一下建構函式,建構函式的順序是從基類開始構造->子類,如果在基類中呼叫虛函式,由於建構函式基類中僅存在自身
(或其父類,如果存在),不會根據虛函式表的規則去呼叫。看如下例子
class base
protected:
virtual callvirtual()
class derived : public base
protected:
virtual callvirtual()
int main() {
derived d;
//結果為base::callvirtual(),因為在基類構造的過程中還沒有構造派生類,虛函式表中派生類的函式並未加入進來
//所以查詢函式的時候只能找到基類的呼叫函式
同理:由於在析構函式中,子類的析構函式已經呼叫過了,在父類的析構函式中也無法訪問子類的虛函式表
C 不要在建構函式和析構函式中呼叫虛函式
這裡先執行個示例 include using namespace std class base virtual void fun virtual void fun 0 base class derived public base virtual void fun virtual void fun d...
建構函式和析構函式中的虛函式呼叫
乙個類的虛函式在它自己的建構函式和析構函式中被呼叫的時候,它們就變成普通函式了,不 虛 了。也就是說不能在建構函式和析構函式中讓自己 多型 例如 class a 在這裡,無論如何都是a foo 被呼叫!a 同上 virtual void foo class b public a void bar 如...
構造和析構函式呼叫順序
c 中建構函式與析構函式的呼叫順序 c 建構函式和析構函式的呼叫順序 基類建構函式 物件成員建構函式 派生類本身的建構函式 派生類本身的析構函式 物件成員析構函式 基類析構函式 與構造順序正好相反 區域性物件,在退出程式塊時析構 靜態物件,在定義所在檔案結束時析構 全域性物件,在程式結束時析構 繼承...