多繼承可以看作是單繼承的擴充套件。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關係仍可看作是乙個單繼承。
多繼承下派生類的定義格式如下:
class 《派生類名》:《繼承方式1>《基類名1>,《繼承方式2>《基類名2>,…
;其中,《繼承方式1>,《繼承方式2>,…是三種繼承方式:public、private、protected之一。例如:
class a
;class b
;class c : public a, public b
;其中,派生類c具有兩個基類(類a和類b),因此,類c是多繼承的。按照繼承的規定,派生類c的成員包含了基類a, b中成員以及該類本身的成員。
多繼承的建構函式
在多繼承的情況下,派生類的建構函式格式如下:
《派生類名》(《總參數列》):《基類名1>(《參數列1>),《基類名2>(《參數列2>),…
《子物件名》(《參數列n+1>),…
其中,《總參數列》中各個引數包含了其後的各個分參數列。
多繼承下派生類的建構函式與單繼承下派生類建構函式相似,它必須同時負責該派生類所有基類建構函式的呼叫。同時,派生類的引數個數必須包含完成所有基類初始化所需的引數個數。
派生類建構函式執行順序是先執行所屬基類的建構函式,再執行派生類本身建構函式,處於同一層次的各基類建構函式的執行順序取決於定義派生類時所指定的各基類順序,與派生類建構函式中所定義的成員初始化列表的各項順序無關。也就是說,執行基類建構函式的順序取決於定義派生類時基類的順序。可見,派生類建構函式的成員初始化列表中各項順序可以任意地排列。
下面通過乙個例子來說明派生類建構函式的構成及其執行順序。
#include
class b1
private:
int b3;
};class a : public b2, public b1
這裡有二義性問題,該函式應修改為:
void c::h()
或者void c::h()
或者void c::f()
另外,在前例中,類b中有乙個成員函式g(),類c中也有乙個成員函式g()。這時,
c1.g();
不存在二義性,它是指c::g(),而不是指b::g()。因為這兩個g()函式,乙個出現在基類b,乙個出現在派生類c,規定派生類的成員將支配基類中的同名成員。因此,上例中類c中的g()支配類b中的g(),不存在二義性,可選擇支配者的那個名字。
當乙個派生類從多個基類派生類,而這些基類又有乙個共同的基類,則對該基類中說明的成員進行訪問時,也可能會出現二義性。例如:
class a
;class b1 : public a
;class b2 : public a
;class c : public b1, public b2
;已知:c c1;
下面的兩個訪問都有二義性:
c1.a;
c1.a::a;
而下面的兩個訪問是正確的:
c1.b1::a;
c1.b2::a;
類c的成員函式f()用如下定義可以消除二義性:
int c::f()
由於二義性的原因,乙個類不可以從同乙個類中直接繼承一次以上,例如:
class a : public b, public b
這是錯誤的。
C 多繼承的二義性
單繼承 派生類只從乙個基類派生 多繼承 派生類從多個基類派生 多重派生 有乙個基類派生出多個不同的派生類 多層派生 派生類又作為基類,繼續派生出新的類 多繼承可以看作是單繼承的擴充套件。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關係仍可看作是乙個單繼承。多繼承下派生類的定義格式如下 c...
C 多繼承的二義性
多繼承可以看作是單繼承的擴充套件。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關係仍可看作是乙個單繼承。多繼承下派生類的定義格式如下 class 派生類名 繼承方式1 基類名1 繼承方式2 基類名2 其中,繼承方式1 繼承方式2 是三種繼承方式 public private protec...
python多繼承二義性
假如在多繼承中,父類a和父類b中有乙個同名的方法,子類呼叫的時候,呼叫哪個呢?class base object def test self print base class a base def test self print a class b base def test self print ...