雞啄米在C++編程入門系列之三十九中講了派生類的構造函數,提到構造函數就不能不說析構函數,這一節主要講講派生類析構函數的相關内容。

       派生類的析構函數也是在派生類對象釋放的時候進行清理工作的。前面說過,派生類無法繼承基類的析構函數,所以如果需要的話就要自己定義析構函數。派生類析構函數的定義方式與一般類的析構函數是一樣的,也是沒有返回類型,沒有參數,所以比構造函數需要注意的東西少多了。

       派生類的析構函數一般隻需要在其函數體中清理新增成員就可以了,對于繼承的基類成員和派生類内嵌對象成員的清理,則一般由系統自動調用基類和對象成員的析構函數來完成。這個執行過程的順序正好和派生類構造函數相反:1.執行析構函數語句清理派生類的新增成員;2.調用内嵌對象成員所屬類的析構函數清理派生類内嵌對象成員,各個對象成員的清理順序與其在構造函數中的構造順序相反;3.調用基類的析構函數清理繼承的基類成員,如果是多繼承則各個基類的清理順序也與其在構造函數中的構造順序相反。總起來一句話,析構函數執行時所有成員或對象的清理順序與構造函數的構造順序剛好完全相反

       上一講的例程中所有類都沒有定義析構函數,這時系統會為每個類生成默認析構函數,由他們完成清理工作。

雞啄米:C++編程入門系列之四十(繼承與派生:派生類的析構函數)

       雞啄米講上一講的例子稍加改造,為每個基類顯示定義析構函數,然後大家看下程序的執行順序。   

       #include <iostream>
       using namespace std;
       class Base1          // 基類Base1
       {
       public:
                  Base1()         { cout<<"Base1 construct"<<endl; }       // Base1的構造函數
                  ~Base1()        { cout<<"Base1 destruct"<<endl; }        // Base1的析構函數
       };
       class Base2          // 基類Base2
       {
       public:
                 Base2(int x)    { cout<<"Base2 construct "<<x<<endl; }    // Base2的構造函數
                 ~Base2()        { cout<<"Base2 destruct"<<endl; }         // Base2的析構函數
       };
       class Base3          // 基類Base3
       {
       public:
                Base3(int y)    { cout<<"Base3 construct "<<y<<endl; }     // Base3的構造函數
                ~Base3()        { cout<<"Base3 destruct"<<endl;}           // Base3的析構函數
       };
       class Child : public Base2, public Base1, public Base3   // 派生類Child
       {
       public:
                Child(int i,int j,int k,int m):Base2(i),b3(j),b2(k),Base3(m)    { }
       private:             // 派生類的内嵌對象成員
                Base1 b1;
                Base2 b2;
                Base3 b3;
       };
       int main()
       {
                Child child(3,4,5,6);
                return 0;
       }

       三個基類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

       從程序的執行結果來看,和我們前面的分析完全一緻,析構函數的執行順序與構造函數完全相反。

       程序雖然就簡單一小段,但執行過程還需要大家認真思考,分析透徹。這些都是以後進階的基礎。關于派生類的構造函數和析構函數雞啄米就講完了,有問題歡迎到雞啄米博客交流。

 

除非特别注明,雞啄米文章均為原創
轉載請标明本文地址:http://dnsf85p.top/software/102.html
2011年12月17日
作者:雞啄米 分類:軟件開發 浏覽: 評論:19