繼承中的構造析構函數調用順序


 

子類構造函數必須對繼承的成員進行初始化:

  1. 通過初始化列表或則賦值的方式進行初始化(子類無法訪問父類私有成員)

  2. 調用父類構造函數進行初始化

    2.1  隱式調用:子類在被創建時自動調用父類構造函數(只能調用父類的無參構造函數和使用默認參數的構造函數)

    2.2  顯示調用:在含參構造函數的初始化列表調用父類構造函數(適用所有的父類構造函數)

 

#include <iostream>
#include <string>

using namespace std;

class PParent                //父父類
{
public:
    PParent(string s)
    {
        cout << "PParent" << s << endl;
    }
    ~PParent()
    {
        cout << "~PParent" << s << endl;
    }
};

class Parent : public PParent  // 父類
{
public:
    Parent() : PParent("Default")  
    {
        cout << "Parent" << endl;
    }
    Parent(string s) : PParent(s)
    {
        cout << "Parent" << s << endl;
    }
    ~Parent() 
    {
        cout << "~Parent" << endl;
    }
};

class sib_child              // 同級類
{
public:
    sib_child() 
    {
        cout << "sib_child" << endl;
    }
    sib_child(string s)
    {
        cout << "sib_child" << s << endl;
    }
    ~sib_child() 
    {
        cout << "~sib_child" << endl;
    }    
};

class Child : public Parent    // 自己
{
    Parent p;
    sib_child sc;
public:
    Child() : Parent(s),sib_child(s)
    {
        cout << "Child" << endl;
    }
    Child(string s) : Parent(s), sib_child(s) // 先調用父類構造函數,再調用同類構造函數
    {
        cout << "Child" << s << endl;
    }
    ~Child() 
    {
        cout << "~Child" << endl;
    }
};

int main()
{       
    Child cc("call : ");
    // 構造順序
    // PParent   : call         父父類
    // Parent    : call          父類
    // sib_child : call         同類
    // Child     : call            自己

    return 0;
    // 析構順序
    // ~Child     : call            自己
    // ~sib_child : call         同類
    // ~Parent    : call          父類
    // ~PParent   : call         父父類
}

 

 

 

構造函數調用順序:

  1. 執行父類構造函數

  2. 執行同級構造函數

  3. 執行自己構造函數

 

析構函數調用順序:

  1. 執行自己析構函數

  2. 執行同級析構函數

  3. 執行父類析構函數

 


免責聲明!

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



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