類的多重繼承

2021-07-25 14:44:33 字數 2885 閱讀 9012

類的多重繼承

引入:通常乙個事物會同時具有多種基類的屬性,如乙個老師同時是職員也是一位父親,這個時候就會使用多重繼承來展示事物的本質屬性

1:

形式

class a:[繼承方式]b,[繼承方式]c {} 注:以逗號在多個基類間產生分隔

2:

建構函式

同樣是在派生類建構函式中利用函式總表初始化各個基類,先呼叫基類的建構函式,後執行函式體,呼叫基類建構函式的順序是按照繼承宣告時的順序來的。

3

:兩個問題

資料重複問題:

多個基類很可能會造成派生類繼承到一些重複的屬性,比如上例中老師有職員的所有特徵,也有父親的所有特徵,但是父親和職員都有年齡,住址,愛好。。。這就會造成資料的重複,總不能有兩個年齡吧,這裡要區分好繼承和子物件的一些區別,不能誤以為研究生類的導師姓名和學生的姓名也屬於資料重複,此時導師是研究生的乙個子物件,只能說研究生有乙個什麼什麼樣的導師(類的組合),而不能說研究生是乙個什麼什麼樣的導師(類的繼承)。

二義性問題:

當多個基類中的都有某一屬性,且標誌符還相同時,就不僅存在資料重複的問題了,還存在這二義性。比如職員類和父親類中年齡都命名為m_nage時,在派生類中若之間使用m_nage來使用物件時,編譯器便不能獲知你想使用的究竟是哪個基類中的資料。

解決辦法:在會產生二義性的地方,標明你想使用物件的作用域,如teacher::m_nage,一定要將作用域標註的有區分度。如果此時派生類中又重新定義乙個名為m_nage的資料,那麼它將會遮蔽其它任何乙個同名的資料

可以這樣來理解 同名資料引用的優先順序:派生類》 基類1=基類2….

資料重複問題

虛基類:主要用來處理,派生的多個直接基類有共同的基類的情況,因為此時我們可以明確,這種情況一定會有多餘的資料。當這些直接基類沒有基類的時候,編譯器便不能肯定是否有資料重複,因為這些基類可能會用不同的識別符號來標明乙個屬性,如年齡。

使用方法

:在間接基類繼承繼承說明繼承方式後加上virtual關鍵字,而派生類繼承說明時則不用加。

派生類的建構函式:

不僅要負責直接執行基類建構函式,而且還要執行總基類建構函式(與普通繼承不同), 但是由於總基類在派生類中只有乙份資料成員,所以這份成員的初始化必須由派生類直接給出,編譯器只執行最後的派生類對總基類建構函式的呼叫,而不執行總基類的直接派生類對總基類建構函式的呼叫,這會保證總基類的資料成員不會被多次初始化。

class a   總基類

;

}

class b:public virtual a   間接基類

;

}

class c: public virtual a   間接基類

;

}

class d: pubic b, public c

}

一般說來,不提倡在程式中使用多重繼承,只有在簡單且不易出現二義性的時候才會使用,避免關係混亂。

5

:基類和派生類之間的轉換

須知:只有公用的派生類才是基類真正的子型別,它完整的繼承類基類的功能,當使用保護或者私有繼承的時候,就會改變資料成員在基類中的訪問屬性,就像基類中的public成員就不能在派生類外進行訪問了,換句話說,這時派生類就開始和基類產生一些重要的不容忽視的區別。

賦值相容:在基類和其子型別之間也存在與型別轉換相似的行為,在某些需要基類的地方可以使用子型別進行替代(因為子型別具有基類的特徵,如需要本科生也可以用研究生替代,但是反過來就說不通,基類並不一定具有子型別的特徵)。具體的替代情形有以下幾種。

1

:指標,引用替代

a  one;  b  two;如b是a的子型別,那麼 可以有

a *pa = &two;

這種使用沒有錯,但是pa還是指向a類的指標,所以仍然不能用pa訪問派生類新增的資料成員。準確來說pa是一種被截斷的b*型指標,只是子型別中的基類成員的位址。引用實質也是指標

因此也存在a&ra  = two;但ra也只關聯基類那一部分成員。

2

:值轉換

如:one  =  two;同樣將two 中的基類部分拷貝到one中。

在其它的隱式的轉換中發生的也是這些情況,如函式的形參為基類或基類的指標型,傳入子型別,或子型別的指標。

類的多重繼承

程式頭部注釋開始 程式的版權和版本宣告部分 檔名稱 作 者 張傳新 完成日期 2012 年 05 月 08 日 版 本 號 1.0 對任務及求解方法的描述部分 輸入描述 問題描述 程式輸出 程式頭部的注釋結束 include includeusing namespace std class teac...

類的繼承 被遺棄的多重繼承

本文參照於狄泰軟體學院,唐佐林老師的 c 深度剖析教程 關聯知識 virtual虛函式,繼承 問題 c 中是否允許乙個類繼承自多個父類?如果可以,那麼會出現什麼問題呢?如果不可以,為什麼?我們在單繼承的語法基礎上,再繼承兩個父類,試試編譯是否能通過。class derived public base...

類的繼承 正確的使用多重繼承

本文參照於狄泰軟體學院,唐佐林老師的 c 深度剖析教程 之前我們發現了多重繼承的三個問題。現在總結一下 1.多重繼承得到的物件可能擁有 不同的位址!無解決方案 2.多重繼承可能產生冗餘的成員 虛繼承解決,但不實用 3.多重繼承可能產生多個虛函式表 c 強制型別轉換解決 在工程開發,我們盡量不要使用直...