析構函數調用的次序是先派生類的析構后基類的析構,也就是說在基類的的析構調用的時候,派生類的信息已經全部銷毀了。
而定義一個對象時先調用基類的構造函數、然后調用派生類的構造函數;析構的時候恰好相反:先調用派生類的析構函數、然后調用基類的析構函數。
原因:
-
派生類構造函數中的某些初始化可能是基於基類的,所以規定構造在類層次的最根處開始,而在每一層,首先調用基類構造函數,然后調用成員(此處的成員只指各種類對象如QString a,不含基本類型變量如int n、指針變量如QString *a)對象構造函數(因為C++的成員變量是不會自動初始化的,只能使用初始化列表初始化(調用成員的構造函數,如果不在初始化列表中顯式調用的話,則會隱式調用成員變量的默認構造函數,通過匯編可以發現)或在本層構造函數內初始化) 參考:http://www.cnblogs.com/lidabo/p/3790606.html)。
-
如果沒有顯式調用基類的構造函數,會自動調用基類的無參構造函數。而如果基類只有帶參數的構造函數,則會報錯。不一定要顯式的無參構造函數,可以顯式調用基類帶參數的構造函數。
#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