不要在構造函數和析構函數中調用虛函數

提到構造函數和析構函數,想必大家肯定是非常瞭解,但是能否在構造函數或是析構函數中調用虛函數呢?

答案是千萬不要這麼做,這麼做不會得到大家想要的結果。

首先提一下構造函數,構造函數的順序是從基類開始構造->子類,如果在基類中調用虛函數,由於構造函數基類中僅存在自身

(或其父類,如果存在),不會根據虛函數表的規則去調用。看如下例子

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(),因爲在基類構造的過程中還沒有構造派生類,虛函數表中派生類的函數並未加入進來

//所以查找函數的時候只能找到基類的調用函數


同理:由於在析構函數中,子類的析構函數已經調用過了,在父類的析構函數中也無法訪問子類的虛函數表


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章