天天看點

C++:多重繼承

單繼承或單基派生:派生類隻有一個基類;

多繼承或多基派生:派生類有兩個或兩個以上的基類。

4.4.1 多重繼承派生類的聲明

在C++中,聲明具有兩個以上的派生類與聲明單機派生類的形式相似,隻需将要繼承的多個基類用逗号分分隔即可,其聲明的一般形式如下:

class 派生類名:繼承方式1 基類名,...,繼承方式n 基類名{

           派生類新增的資料成員和成員函數 

};

冒号後面的部分稱為基類表,各基類之間用逗号分隔,其中“繼承方式i”(i=1,2,...,n),規定了派生類從基類中按什麼方式繼承:private、protected、public。預設的繼承方式是private。

例如:

     class z:public x,y{ //類z公有繼承了類x,私有繼承了y(預設的) 

                 ...

     };

     class z:x,public y{ //類z私有繼承了類x(預設的),公有繼承了y

                  ...

    class z:public x,public y{ //類z公有繼承了類x和類y 

      }; 

在多種繼承中,三種繼承方式對于基類成員在派生類中的通路屬性規則與單繼承相同。

//例4.13 多重繼承情況下派生類的通路特性。

C++:多重繼承
C++:多重繼承

說明:對基類成員的通路必須是無二義的,例如下列程式段對基類成員的通路是二義的,必須想辦法消除二義性。

C++:多重繼承
C++:多重繼承

如定義類Z的對象obj:

      Z obj;

則以下對函數f()的通路是二義性的:

      obj.f(); //二義性錯誤,不知調用的是類X的f(),還是類Y的f()

使用成員名限定可以消除二義性,例如:

      obj.X::f(); //調用了類X的f() 

      obj.Y::f(); //調用了類Y的f() 

4.4.2 多重繼承派生類構造函數和析構函數

多重繼承下派生類構造函數的定義形式與單繼承派生類構造函數的定義形式相似,隻是n個基類的構造函數之間用逗号分隔。多重繼承下派生類構造函數定義的一般形式如下:

派生類名(參數總表):基類名1(參數表1),基類名2(參數表2),...,基類名n(參數表n)

{

        派生類新增成員的初始化語句 

}

多重繼承的構造函數的執行順序與單繼承構造函數的執行順序相同,也是遵循先執行基類的構造函數,在執行對象成員的構造函數,最後執行派生類的構造函數體的原則。處于同一層次的各個基類構造函數的執行順序,取決于聲明派生所指定的各個基類的順序,與派生類構造函數中所定義的成員初始化清單的各項順序沒有關系。由于析構函數不帶參數,在派生類中是否要定義析構函數與它所屬的基類無關,是以與單繼承情況類似,基類的析構函數不會因為派生類沒有析構函數而得不到執行,它們是各自獨立的。析構函數的執行順序與構造函數的執行順序相反。

C++:多重繼承
C++:多重繼承

例4.14 多重繼承情況下派生類構造函數和析構函數的定義方法。

C++:多重繼承
C++:多重繼承

程式猿神奇的手,每時每刻,這雙手都在改變着世界的互動方式!

本文轉自當天真遇到現實部落格園部落格,原文連結:http://www.cnblogs.com/XYQ-208910/p/4912406.html,如需轉載請自行聯系原作者

繼續閱讀