子類構造、析構時調用父類的構造、析構函數順序


析構函數調用的次序是先派生類的析構后基類的析構,也就是說在基類的的析構調用的時候,派生類的信息已經全部銷毀了。

定義一個對象時先調用基類的構造函數、然后調用派生類的構造函數;析構的時候恰好相反:先調用派生類的析構函數、然后調用基類的析構函數。

原因:

  1. 派生類構造函數中的某些初始化可能是基於基類的,所以規定構造在類層次的最根處開始,而在每一層,首先調用基類構造函數,然后調用成員(此處的成員只指各種類對象如QString a,不含基本類型變量如int n、指針變量如QString *a)對象構造函數因為C++的成員變量是不會自動初始化的,只能使用初始化列表初始化(調用成員的構造函數,如果不在初始化列表中顯式調用的話,則會隱式調用成員變量的默認構造函數,通過匯編可以發現)或在本層構造函數內初始化)        參考:http://www.cnblogs.com/lidabo/p/3790606.html)。

  2. 如果沒有顯式調用基類的構造函數,會自動調用基類的無參構造函數。而如果基類只有帶參數的構造函數,則會報錯。不一定要顯式的無參構造函數,可以顯式調用基類帶參數的構造函數。

#include<iostream>
using namespace std;
class Base{
public:
    Base(int c){cout<< "基類帶參構造函數" << c << endl;}
    ~Base(){cout<<"基類析構" << endl;}
};
class Derived:public Base{
public:
    Derived(int c):Base(c) // 顯式調用基類構造函數
    {
        cout<< "派生類帶參構造函數" << c << endl;
    }
    ~Derived(){cout<<"派生類析構" << endl;}
};
int main()
{
    int i = 9;
    Derived d1(i);
    return 0;
}

輸出結果:

基類帶參構造函數9

派生類帶參構造函數9

派生類析構

基類析構

轉自:http://zhidao.baidu.com/link?url=fdBaMWX2-7zCBRQDow9LtkNGa9rRnvz6rhybNxvRc1tP8Puhx4HeKPfrdLHETk3DyFjnSHDvhA1daydeTc0x4RF0458i_r_rOWFoH3N5JcG

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM