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


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

運行結果

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

 

父類構造含參調用規則

https://www.cnblogs.com/bonelee/p/5825885.html


免責聲明!

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



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