C++中多重繼承構造函數調用的先後順序

//先看一段簡單的代碼,其中E、D是祖先類
#include<iostream>
using namespace std;

class E {
    public:
        E() {
            cout << "In E()" << endl;
        }
        ~E() {
            cout << "In ~E()" << endl; 
        }
};

class C {
    public:
        C() {
            cout << "In C()" << endl;
        }
        ~C() {
            cout << "In ~C()" << endl;
        }
};

class D : public E, public C {
    public:
        D() {
            cout << "In D()" << endl;
        }
        ~D() {
            cout << "In ~D()" << endl;
        }
};
 
class A : public C {
    public:
        A() {
            cout << "In A()" << endl;
        }
        ~A() {
            cout << "In ~A()" << endl;
        }
};

class B : public D, public A {
    public:
        B() {
            cout << "In B()" << endl;
        }
        ~B() {
            cout << "In ~B()" << endl;
        }
};

int main() {
    B b;
    return 0;
}

(由dev-C++通過)

這裏面的E、C是最終的祖先類,D繼承了E和C,A繼承了C,最後B繼承了D和A。

當在main函數中實例化類B之後,由運行結果及 繼承順序 class B : public D, public A 可知:編譯器會從左向右掃描該語句,先構造類D(構造類D之前又需要根據類D的繼承順序先構造類E和類C),之後再構造類A(構造類A之前又需要構造類C),所以最終的構造順序會是:E、C、D、C、A、B。 析構函數的調用順序與構造函數恰好相反。

要注意的一點是:在該例中,類B通過類D和類A間接繼承了兩次類C,此時的類B中含有兩份類C的拷貝,若C中含有數據成員,則可能會導致二義性(ambiguous),這樣的多重繼承方式稱爲:複製繼承。 更好的多重繼承方式爲:共享繼承,之後再加上例子研究。

發佈了15 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章