C++筆記(10):多重繼承

來源:互聯網
上載者:User

標籤:語句   對象   int()   而在   初始化   class   順序   機制   int   

                        多重繼承

 

C++允許一個衍生類別繼承自另一個類。

同時又允許一個衍生類別同時繼承多個基類。這被稱為多重繼承。
 
聲明多重繼承的方法
class D: public A, public B, public C
{
   //...
};
 
D是多重繼承的衍生類別。它以公有繼承的方式同時繼承自A、B、C。
 
建構函式構造順序
D:D()
 :A(), B(), C()
{
}
 調用順序為:先調用基類的建構函式,在執行衍生類別的建構函式。基類的建構函式調用順序按照聲明衍生類別時基類的出現順序。
解構函式調用順序與構造順序相反
 
同名成員函數的二義性
在單繼承下,基類的public 和protected 成員可以直接被訪問,就像它們是衍生類別的成員一樣,對多繼承這也是正確的。但是在多繼承下,衍生類別可以從兩個或者更多個基類中繼承同名的成員。然而在這種情況下,直接存取是二義的,將導致編譯時間刻錯誤。
例如,如果A和B 都定義了一個成員函數print(),
則如下語句:
D d;
d.print();
將導致編譯時間錯誤,即使這兩個通過繼承得到的成員函數定義了不同的參數類型:
原因在於繼承得到的成員函數沒有構成衍生類別中的重載函數,因此,對於print()調用,編譯器在解析的時候,只是使用了針對print 的名字解析。解決的方法是在方法前加上所屬的類d.A::print();
 
虛基類
儘管在衍生的資料行表中不允許同一個基類出現兩次,但實際上衍生類別可以多次繼承同一個類。

衍生類別通常會含有繼承鏈上每個類對應的子部分。在上面的兩種情況中,class D都間接地繼承了class A兩次,那麼意味著class D中包含了class A的兩份拷貝。所以在一個class D的對象中將含有2組class A的成員,此時若不加首碼限定符直接使用某個成員將引發“二義性”錯誤:
為瞭解決上述問題,C++提供了虛繼承的機制。虛繼承的目的是令某個類作出聲明,承諾願意共用它的基類。共用的基類子物件稱為虛基類。在這種機制下,不論虛基類在繼承體系中出現多少次,在衍生類別中都只包含唯一一個共用的虛基類子物件。我們指定虛基類的方式是在衍生的資料行表中添加關鍵字virtual:
class B: virtual public A
{
}
 
class C: virtual public A
{
}
class D: public B,public C
{
}
 含有虛基類的對象的構造順序與一般的多重繼承的構造順序稍有區別:先初始化虛基類子物件(最低層衍生類別負責),然後按衍生的資料行表中的順序依次對直接基類(非虛)進行初始化。
 

 

C++筆記(10):多重繼承

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.