派生類的構造函數與析構函數的調用順序
阿新 • • 發佈:2019-02-02
inf 函數 函數的調用 image 類名 去掉 pan -m 形參 派生類構造函數各部分的執行次序為
1.調用基類的構造函數,按他們在派生類定義的先後順序,順序調用。
2.調用成員對象的構造函數,按他們在類定義中聲明的先後順序,順序調用
3.派生類的構造函數體中的操作 在派生類構造函數中,只要基類不是使用缺省構造函數,都要顯式給出基類名和參數表
如果基類沒有定義構造函數,則派生類也可以不定義,全部采用系統給定的缺省構造函數。
如果基類定義了帶有形參表的構造函數時,派生類就應當定義構造函數。
1.調用基類的構造函數,按他們在派生類定義的先後順序,順序調用。
2.調用成員對象的構造函數,按他們在類定義中聲明的先後順序,順序調用
3.派生類的構造函數體中的操作 在派生類構造函數中,只要基類不是使用缺省構造函數,都要顯式給出基類名和參數表
如果基類沒有定義構造函數,則派生類也可以不定義,全部采用系統給定的缺省構造函數。
如果基類定義了帶有形參表的構造函數時,派生類就應當定義構造函數。
//Test1.h #include<iostream> using namespace std; class Base1 { private: int a1; public: Base1()//(int _a):a1(_a) { cout<<"It‘s base1 built. "<<endl; } ~Base1(){cout<<"Base1 was free. "<<endl;} }; class Base2 { private: int a2; public: Base2()//(int _a):a2(_a) { cout<<"It‘s base2 built. "<<endl; } ~Base2(){cout<<"Base2 was free. "<<endl;} }; class Base3 { private: int a3; public: Base3()//(int _a):a3(_a) { cout<<"It‘s base3 built. "<<endl; } ~Base3(){cout<<"Base3 was free. "<<endl;} }; class Son : public Base2,public Base1,public Base3//1.調用基類的構造函數,按他們在派生類定義的先後順序,順序調用。 {private://2.調用成員對象的構造函數,按他們在類定義中聲明的先後順序,順序調用 Base1 a; Base3 b; Base2 c; public: Son()//:Base1(_a),Base2(_a),Base3(_a),a(_a),b(_a),c(_a) { cout<<"It‘s son built. "<<endl;//3.派生類的構造函數體中的操作 } ~Son(){cout<<"Son was free. "<<endl;} };
將父類和派生類構造函數後的“//”去掉便是
在派生類構造函數中,只要基類不是使用缺省構造函數,都要顯式給出基類名和參數表
所描述的意思。
//Test.cpp
#include"Test1.h" void main() { Son son;//son(10) }
由Son類可以看出構造函數的順序應該為2,1,3,1,3,2,son
運行結果
析構函數和構造函數順序相反。
派生類的構造函數與析構函數的調用順序