由多個基類共同派生出派生類的繼承結構稱為
多重繼承
或多繼承
(multiple-inheritance)。
多重繼承是從實際的需要產生的。例如:從大學在冊人員產生學生和教職工。再從學生派生研究生。如果考慮到研究生可以當助教,那麼他們又有了教職工的特性。教職工可分為教師和行政人員,但行政人員也可以去授課,兼有教師的特點等。這就是多繼承,其繼承關係如下圖所示。
圖 大學在冊人員繼承關係
問題1:教職工兼研究生,在其基類「教職工」中有乙個「身份證號」,另一基類「研究生」中也有乙個「身份證號」,如果只講他的身份證號那麼是哪乙個基類中的呢?這兩者可能是一回事,但計算機系統並不這麼認為。
問題2:兩個基類中可能也各有乙個「職務」,這兩者可能根本不同,乙個是教職工的,乙個是研究生的。但它們的識別符號是一樣的,這就會出現二義性。
解決辦法
:類似於「職務」這樣的成員可以用不同識別符號來區分。
但「身份證號」不行,因為這是由兩個基類「教職工」和「研究生」共同的基類「在職人員」類繼承來的,只有同乙個標誌符。即唯一標識問題,通常採用作用域分辨符「::」:
基類名::成員名; //資料成員
基類名::成員名(參數列); //函式成員
舉例:下圖為在職研究生派生類關係
根據圖中顯示的派生關係,定義egstudent類物件egstudent1,並假定派生全部為公有派生,而int no全為公有成員,其含義如下所述:
egstud1.no //在職學號
egstud1.gstudent::no //研究生號
egstud1.gstudent.student::no //學生號,此處只為了說明成員唯一標識
egstud1.gstudent.student.person::no //身份證號
egstud1.employee::no //工作證號
egstud1.employee.person::no //身份證號egstud1.gstudent.student.person::no和egstud1.employee.person::no這兩個身份證號從邏輯上講應是一回事,但是物理上分配了不同記憶體空間,是兩個變數,請參見下圖(圖中藍色框為相應類的物件)。
若class person的身份證號標識為 int idperson,則可寫為:
egstud1.gstudent::idperson
egstud1.employee::idperson
採用有確定字面意思的識別符號,可以被編譯器簡單區分出來,且不必標出那麼多層次的類,但
寫egstud1.idperson是錯
的。作用域分辨符不能巢狀使用,如
下面的描述均是錯誤
的:egstud1.gstudent::student::no //學生號
egstud1.gstudent::student::person::no //身份證號【例8.2】由圓和高多重繼承派生出圓錐。因為公有派生時,在派生類中不可以直接訪問基類的私有成員,但可以直接訪問基類的保護成員,所以當需要在派生類中訪問基類的資料成員時,可以將它們定義為保護的,而不是私有的。 (
檢視原始碼
)
多重繼承 派生類
作 者 劉慧豔 完成日期 2014 年6月20日 版 本 號 v1.0 問題描述 分別宣告teacher 教師 類和cadre 幹部 類,採用多重繼承方式 由這兩個類派生出新類teacher cadre 教師兼幹部 類。要求 1 在兩個基類中都包含姓名 年齡 性別 位址 等資料成員。2 在teach...
C 派生類的成員標識與訪問
成員訪問屬性 1.1.不可訪問 2.2.私有3.3.保護4.4.公有一 基類與派生類有同名成員 二義性問題 一般說來,在派生類中對基類成員的訪問應該是唯一的,但是,由於多繼承情況下,可能造成對基類中某成員的訪問出現了不唯一的情況,則稱為對基類成員訪問的二義性問題。用 物件名.成員名 物件指標 成員名...
C 派生類的成員標識與訪問
成員訪問屬性 1.1.不可訪問 2.2.私有 3.3.保護 4.4.公有 一 基類與派生類有同名成員 二義性問題 一般說來,在派生類中對基類成員的訪問應該是唯一的,但是,由於多繼承情況下,可能造成對基類中某成員的訪問出現了不唯一的情況,則稱為對基類成員訪問的二義性問題。用 物件名.成員名 物件指標 ...