1. 程式人生 > >派生類的構造函數與析構函數的調用順序

派生類的構造函數與析構函數的調用順序

inf 函數 函數的調用 image 類名 去掉 pan -m 形參

派生類構造函數各部分的執行次序為
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

運行結果

技術分享圖片

析構函數和構造函數順序相反。

派生類的構造函數與析構函數的調用順序