派生類的析構函式也是在派生類物件釋放的時候進行清理工作的。前面說過,
派生類無法繼承基類的析構函式,所以如果需要的話就要自己定義析構函式。
派生類析構函式的定義方式與
一般類的析構函式
是一樣的,也是沒有返回型別,沒有引數,所以比建構函式需要注意的東西少多了。
派生類的析構函式一般只需要在其函式體中清理新增成員就可以了
,對於繼承
的基類成員和派生類內嵌物件成員的清理,則一般由系統自動呼叫基類和物件成員的析構函式來完成
。這個執行過程的順序正好和派生類建構函式相反:1.
執行析構函式語句清理派生類的新增成員
;2.呼叫內嵌物件成員所屬類的析構函式清理派生類內嵌物件成員,各個物件成員的清理順序與其在建構函式中的構造順序相反
;3.呼叫基類的析構函式清理繼承的基類成員,如果是多繼承則各個基類的清理順序也與其在建構函式中的構造順序相反
。總起來一句話,
析構函式執行時所有成員或物件的清理順序與建構函式的構造順序剛好完全相反。
前面的例程中所有類都沒有定義析構函式,這時系統會為每個類生成預設析構函式,由他們完成清理工作。
講前面的例子稍加改造,為每個基類顯示定義析構函式,然後看下程式的執行順序。
#include
using namespace
std;
class base1 // 基類base1
;class base2 // 基類base2
;class base3 // 基類base3
;class child : public base2, public base1, public base3 // 派生類child
private: // 派生類的內嵌物件成員
base1 b1;
base2 b2;
base3 b3;
};int main()
三個基類base1、base2和base3都新增了析構函式,
派生類child沒有新增,系統會為派生類生成預設析構函式
。主函式的函式體沒有變。
程式執行時會先呼叫child類的建構函式構造child物件,然後呼叫child類的預設析構函式完成清理工作
。child類的預設析構函式會依次呼叫內嵌物件成員的析構函式和基類的析構函式,執行順序和建構函式完全相反。
上面程式的執行結果是:
base2 construct 3
base1 construct
base3 construct 6
base1 construct
base2 construct 5
base3 construct 4
base3 destruct
base2 destruct
base1 destruct
base3 destruct
base1 destruct
base2 destruct
從程式的執行結果來看,和前面的分析完全一致,析構函式的執行順序與建構函式完全相反。
派生類的析構函式
include using namespace std class base base int i,int j base void print private int b1,b2 base base int i,int j base base class derived public base de...
派生類的建構函式與析構函式
派生類的建構函式的定義形式為 派生類名 派生類名 引數總表 基類名1 引數名錶1 基類名2 引數名錶2 基類名n 引數名錶n 成員物件名1 成員物件引數名錶1 成員物件名m 成員物件引數名錶m 所列出的成員物件名全部為新增成員物件的名字 本例只是為了演示派生類的定義與使用,盡可能顧及最常用的各方面。...
詳解派生類建構函式與析構函式
1.派生類建構函式 派生類不能繼承基類的建構函式,必須自己定義建構函式進行新增資料成員初始化工作,如果想同時初始化基類資料成員,必須呼叫基類建構函式。1 簡單派生類建構函式 1 include 2 3 include 4 5 using namespace std 6 7 8 9 class st1...