為多型基類宣告virtual析構函式

2021-08-19 11:48:32 字數 1139 閱讀 2459

一、中心內容

1、polymorphic(帶多型性質的)base classes應該宣告乙個virtual析構函式。如果class帶有任何virtual函式,它就應該擁有乙個virtual析構函式;

2、classes的設計目的如果不是作為base classes使用,或不是為了具備多型性,就不該宣告virtual析構函式。

二、內容簡介

1、資源洩漏

class timekeeper;

class waterclock: public timekeeper;

class wristwatch: public timekeeper;

int main

timekeeper* ptk = gettimekeeper();

//gettimekeeper()返回乙個指標,指向乙個派生類的動態分配的指標

......

delete ptk;

note:

1、問題出在基類的析構函式不是virtual的;

因為gettimekeeper()返回的指標指向乙個派生類物件,而那個物件卻經由乙個基類指標被刪除,所以可能會造成物件的衍生部分沒有被銷毀,造成「區域性銷毀」的現象。

class timekeeper;

任何class只要帶有virtual函式幾乎確定應該也有乙個virtual析構函式

2、若class不含virtual函式,通常表示它並不意圖被用作乙個基類

這時候不要令析構函式為virtual!!!

(1)一般不要繼承不含任何virtual函式的類。

比如:string,vector, list, set......

(2)抽象類

抽象類是由pure virtual析構函式導致的,它不能夠實體化,也就是說不能為其建立物件。

所以當你希望有乙個抽象類時,為其宣告乙個pure virtual析構函式。。

e.gclass awov;

awov::~awov(){}//還得給此析構函式乙個定義,不然聯結器會出錯

note:

析構函式的運作方式:

先呼叫最深層次的那個class的析構函式最先被呼叫,然後是其每乙個基類class的析構函式被呼叫

為多型基類宣告virtual析構函式

書籍 effective c 中的條款7 讀書筆記 條款7的內容,可以大致總結為下面幾個問題 問題1 什麼是多型基類?問題2 為什麼要把多型基類的析構函式宣告為virtual析構函式?問題3 是不是應該把所有的類的析構函式宣告為virtual函式?下面來詳細回答上面三個問題 問題1 什麼是多型基類?...

條款07 為多型基類宣告virtual析構函式

結論1 polymorphic 帶多型性質的 base classes 應宣告乙個virtual 析構函式。如果class帶有任何virtual函式,它就應該擁有乙個virtual析構函式。c 指出當derived class物件經由乙個base class指標被刪除,而該base class帶有乙...

7 為多型基類宣告virtual析構函式

1 一般情況下,如果class中有乙個函式為virtual時,那個可以認為該class具有多型性質,這時需要把該類的析構函式宣告為virtual性質的,因為如果不宣告為virtual性質的話,基類的析構函式將不被呼叫到,這時當derived class部分析構時,釋放的只是derived class...