多繼承的構造順序

構造對象的規則需要擴展以控制多重繼承。構造函數按下列順序被調用:
  (1)任何    虛擬基類的構造函數按照它們被繼承的順序構造;(#add 即聲明順序)
  (2)任何非虛擬基類的構造函數按照它們被繼承的順序構造;
  (3)任何成員對象的構造函數按照它們聲明的順序調用;
  (4)類自己的構造函數。
  例如:

    //**********************
    //**   ch17_4.cpp  **
    //**********************

    #include<iostream.h>

    class OBJ1
    {
     public:
      OBJ1(){ cout <<"OBJ1\n"; }
    };

    class OBJ2
    {
     public:
      OBJ2(){ cout <<"OBJ2\n"; }
    };

    class Base1
    {
     public:
      Base1(){ cout <<"Base1\n"; }
    };

    class Base2
    {
     public:
      Base2(){ cout <<"Base2\n"; }
    };

    class Base3
    {
     public:
      Base3(){ cout <<"Base3\n"; }
    };

    class Base4
    {
     public:
      Base4(){ cout <<"Base4\n"; }
    };

    class Derived :public Base1, virtual public Base2,
        public Base3, virtual public Base4
    {
     public:
      Derived() :Base4(), Base3(), Base2(), 
         Base1(), obj2(), obj1()
     {
      cout <<"Derived ok.\n";
     }
     protected:
      OBJ1 obj1;
      OBJ2 obj2;
    };

    void main()
    {
     Derived aa;
    }

  運行結果爲:
    Base2
    Base4
    Base1
    Base3
    OBJ1
    OBJ2
    Derived ok.

  Derived的虛基類Base2和Base4最先構造,儘管它在Derived類中出現的順序不在最前面;Derived的非虛基類其次構造,不管它在Derived構造函數中出現的順序如何;Derived的組合對象obj1和。obj2隨後構造, 它以類定義時,數據成員排列順序爲準, 不管在Derived構造函數中出現順序怎樣;最後是Derived類構造函數本身。

  ->在語言中實現多繼承並不容易,這主要是編譯程序問題,還有模糊性問題。建議你如果可能,在進一步閱讀有關參考書之前,儘量避免用多重繼承。單個繼承提供了足夠強大的功能,不一定非用多重繼承不可。我們應先學會閱讀一些商品化的類庫源程序中有關多重繼承的部分,因爲那些都是經過測試的安全代碼。

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