多重繼承的構造函數和析構函數的執行順序(包含虛基類)

下面示例就是說明多重繼承析構函數和構造函數的執行順序:

#include <iostream>
using namespace std;

class A {
public:
    A(int i)
    {
        cout << "父類A構造函數被調用:" << i<<endl;
    }


    virtual ~A()
    {
        cout << "父類A虛構函數被調用:" << endl;
    }
};
class B {
public:
    B(int i)
    {
        cout << "父類B構造函數被調用:" <<i<< endl;
    }


    virtual ~B()
    {
        cout << "父類B虛構函數被調用:" << endl;
    }
};

class C : public A, virtual public B
{
public:
    C(int i,int j,int k,int l):A(l),B(i),b1(j),a(k)
    {
        cout << "C子類構造函數被調用" << endl;
    }


    ~C()
    {
        cout << "C子類虛構函數被調用:" << endl;
    }
    A a;
    B b1;
    
};

int main()
{
    cout << "B類是C類的虛基類,A類是C類的非虛基類" << endl;
    cout << "----------下面是執行順序------------" << endl;
    A *pa = new C(1,2,3,4);
    delete pa;
    system("PAUSE");
    return(0);
}

運行結果:
在這裏插入圖片描述
結論:
繼承構造函數的執行順序是:先基類,再子對象成員,最後是派生類。析構函數則與之相反。當多重繼承時,如有繼承虛基類,那麼構造的順序是,虛基類先於非虛基類。再就是,子對象成員的構造順序跟它們的聲明順序有關,跟初始化參數列表無關。

注:
1、虛基類的作用是消除二義性
2、當父類指針指向子類對象,如果基類的析構函數不是虛析構函數,那麼釋放對象時不會執行派生類析構函數,virtual ~Base() { cout << “Base Destructor”<<endl; }即可執行派生類的析構函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章