析構函式定義為虛函式原因

2022-05-05 22:39:19 字數 1232 閱讀 9077

**

先看下面一段程式:

#include

using namespace std;

class person

};class student : public person

};int main()

執行結果:

person::~person()

student::~student()

person::~person()

student::~student()

person::~person()

如果在基類中析構函式不加virtual,結果為:

person::~person()

person::~person()

student::~student()

person::~person()

可以看出:只有在用基類的指標指向派生類的時候,才會出現這種情況。因為這個時候虛函式發揮了動態的作用。

析構函式執行時先呼叫派生類的析構函式,其次才呼叫基類的析構函式。如果析構函式不是虛函式,而程式執行時又要通過基類的指標去銷毀派生類的動態物件,那麼用delete銷毀物件時,只呼叫了基類的析構函式,未呼叫派生類的析構函式。這樣會造成銷毀物件不完全。

如果在上面的例子中,基類中未定義virtual析構函式,而派生類中定義了virtual的析構函式,此時用基類指標指向派生類,再delete掉,

即:class person

};class student : public person

};person * pt = new student;

delete pt;

執行結果會出錯。

反正是只要基類析構沒有定義為virtual,而派生類(可能有多層)中有把析構定義為virtual的,此時用基類的指標指向派生類,再delete,會出錯。

而:class person

};class student : public person

};class onest : public student

};如果用

student * pt = onest;  

delete pt;

執行結果為:

onest::~onest()

student::~student()

person::~person()

是可以執行的。

effective c++ (第7條:要將多型基類的析構函式宣告為虛函式)

需要記住的

析構函式定義為虛函式原因

注 本文內容 於zhice163博文,感謝作者的整理。1.為什麼基類的析構函式是虛函式?在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。下面 網路 源位址 a.第一段 includeusing namespace std class clxbase clxbase ...

析構函式定義為虛函式原因

先看下面一段程式 include using namespace std class person class student public person int main 執行結果 person person student student person person student studen...

析構函式定義為虛函式原因

先看下面一段程式 include using namespace std class person class student public person int main 執行結果 person person student student person person student studen...