提到構造函數和析構函數,想必大家肯定是非常瞭解,但是能否在構造函數或是析構函數中調用虛函數呢?
答案是千萬不要這麼做,這麼做不會得到大家想要的結果。
首先提一下構造函數,構造函數的順序是從基類開始構造->子類,如果在基類中調用虛函數,由於構造函數基類中僅存在自身
(或其父類,如果存在),不會根據虛函數表的規則去調用。看如下例子
class Base {
public:
Base() { callVirtual(); }
protected:
virtual callVirtual() { fprintf(stdout, "Base::callVirtual()\n");}
};
class Derived : public Base {
public:
Derived() {}
protected:
virtual callVirtual() { fprintf(stdout, "Derived::callVirtual()\n");}
};
int main() {
Derived d;
}
//結果爲Base::callVirtual(),因爲在基類構造的過程中還沒有構造派生類,虛函數表中派生類的函數並未加入進來
//所以查找函數的時候只能找到基類的調用函數
同理:由於在析構函數中,子類的析構函數已經調用過了,在父類的析構函數中也無法訪問子類的虛函數表