1.繼承許可權
1.public繼承方式基類中所有 public 成員在派生類中為 public 屬性;基類中所有 protected 成員在派生類中為 protected 屬性;基類中所有 private 成員在派生類中不能使用
2.protected繼承方式
基類中的所有 public 成員在派生類中為 protected 屬性;
基類中的所有 protected 成員在派生類中為 protected 屬性;
基類中的所有 private 成員在派生類中不能使用。
3.private繼承方式
基類中的所有 public 成員在派生類中均為 private 屬性;
基類中的所有 protected 成員在派生類中均為 private 屬性;
基類中的所有 private 成員在派生類中不能使用
在派生類中訪問private的方法:
1.借助基類的非 private 成員函式
2.如果基類沒有非 private 成員函式,那麼該成員在派生類中將無法訪問
2.改變訪問許可權
使用 using 關鍵字可以改變基類成員在派生類中的訪問許可權,例如將 public 改為 private
例子:using people::m_name;
using people::m_age;
3.名字遮蔽
什麼是遮蔽?
1.如果派生類中的成員(包括成員變數和成員函式)和基類中的成員重名,那麼就會遮蔽從基類繼承過來的成員。
2.所謂遮蔽,就是在派生類中使用該成員(包括在定義派生類時使用,也包括通過派生類物件訪問該成員)時,實際上使用的是派生類新增的成員,而不是從基類繼承來的
注意:1.基類成員函式和派生類成員函式不構成過載
2.基類成員和派生類成員的名字一樣時會造成遮蔽
3.成員函式要引起注意,不管函式的引數如何,只要名字一樣就會造成遮蔽。
4.換句話說,基類成員函式和派生類成員函式不會構成過載,如果派生類有同名函式,那麼就會遮蔽基類中的所有同名函式,不管它們的引數是否一樣。
4.派生類的建構函式
1.類的建構函式不能被繼承。
2.建構函式不能被繼承是有道理的,因為即使繼承了,它的名字和派生類的名字也不一樣,不能成為派生類的建構函式,當然更不能成為普通的成員函式。
3.在設計派生類時,對繼承過來的成員變數的初始化工作也要由派生類的建構函式完成,但是大部分基類都有 private 屬性的成員變數,它們在派生類中無法訪問,更不能使用派生類的建構函式來初始化。
建構函式的呼叫順序:
基類建構函式總是被優先呼叫,這說明建立派生類物件時,會先呼叫基類建構函式,
再呼叫派生類建構函式,如果繼承關係有好幾層的話,
例如:a --> b --> c
那麼建立 c 類物件時建構函式的執行順序為:
a類建構函式 --> b類建構函式 --> c類建構函式
注意:1.建構函式的呼叫順序是按照繼承的層次自頂向下、從基類再到派生類的。
2.派生類建構函式中只能呼叫直接基類的建構函式,不能呼叫間接基類的。
5.基類構造函式呼叫規則
1.通過派生類建立物件時必須要呼叫基類的建構函式,這是語法規定。
2.換句話說定義派生類建構函式時最好指明基類建構函式;
3.如果不指明,就呼叫基類的預設建構函式(不帶引數的建構函式);如果沒有預設建構函式,那麼編譯失敗。
6.派生類的析構函式
1.和建構函式類似,析構函式也不能被繼承。
2.與建構函式不同的是,在派生類的析構函式中不用顯式地呼叫基類的析構函式,因為每個類只有乙個析構函式,編譯器知道如何選擇,無需程式設計師干涉
3.另外析構函式的執行順序和建構函式的執行順序也剛好相反:
4.建立派生類物件時,建構函式的執行順序和繼承順序相同,即先執行基類建構函式,再執行派生類建構函式。
5.而銷毀派生類物件時,析構函式的執行順序和繼承順序相反,即先執行派生類析構函式,再執行基類析構函式
7.c++的多繼承類
多繼承的語法也很簡單,將多個基類用逗號隔開即可。
例如已宣告了類a、類b和類c,那麼可以這樣來宣告派生類d:
class d: public a, private b, protected c
d 是多繼承形式的派生類,它以公有的方式繼承 a 類,以私有的方式繼承 b 類,以保護的方式繼承 c 類。d 根據不同的繼承方式獲取 a、b、c 中的成員,確定它們在派生類中的訪問許可權。
8.多繼承下的建構函式
1.多繼承形式下的建構函式和單繼承形式基本相同,只是要在派生類的建構函式中呼叫多個基類的建構函式。
2.基類建構函式的呼叫順序和和它們在派生類建構函式中出現的順序無關,而是和宣告派生類時基類出現的順序相同。
9.命名衝突:
當兩個或多個基類中有同名的成員時,如果直接訪問該成員,就會產生命名衝突,編譯器不知道使用哪個基類的成員。
這個時候需要在成員名字前面加上類名和域解析符::,以顯式地指明到底使用哪個類的成員,消除二義性。
10.虛繼承和虛基數
多繼承時很容易產生命名衝突,即使我們很小心地將所有類中的成員變數和成員函式都命名為不同的名字,命名衝突依然有可能發生,比如典型的是菱形繼承。
虛繼承:
1.在繼承方式前面加上 virtual 關鍵字就是虛繼承
2.虛繼承的目的是讓某個類做出宣告,承諾願意共享它的基類。
3.其中,這個被共享的基類就稱為虛基類(virtual base class),本例中的 a 就是乙個虛基類。
4.在這種機制下,不論虛基類在繼承體系中出現了多少次,在派生類中都只包含乙份虛基類的成員。
小結:1.在虛繼承中:虛基類是由最終的派生類初始化的,換句話說,最終派生類的建構函式必須要呼叫虛基類的建構函式。
2.對最終的派生類來說,虛基類是間接基類,而不是直接基類。
3.這跟普通繼承不同,在普通繼承中,派生類建構函式中只能呼叫直接基類的建構函式,不能呼叫間接基類的
注意:c++規定必須由最終的派生類 d 來初始化虛基類 a,直接派生類 b 和 c 對 a 的建構函式的呼叫是無效的
建構函式的執行順序:
虛繼承時建構函式的執行順序與普通繼承時不同:
1.在最終派生類的構造函式呼叫列表中,不管各個建構函式出現的順序如何,編譯器總是先呼叫虛基類的建構函式,再按照出現的順序呼叫其他的建構函式;
2.對於普通繼承,就是按照建構函式出現的順序依次呼叫的
繼承和派生類
一 基本概念 繼承是物件導向的程式設計的重要特色之一,它可以有效提高軟體的重用性。若在已有類a的基礎上建立了乙個新類b,則稱類b繼承了類a,類a稱為基類或父類,類b稱為派生類或子類。c 中,繼承又分單一繼承和多重繼承。若派生類只有乙個基類,則稱為單一繼承 若派生類的基類多於乙個,則稱為多重繼承。1 ...
多重繼承 派生類
作 者 劉慧豔 完成日期 2014 年6月20日 版 本 號 v1.0 問題描述 分別宣告teacher 教師 類和cadre 幹部 類,採用多重繼承方式 由這兩個類派生出新類teacher cadre 教師兼幹部 類。要求 1 在兩個基類中都包含姓名 年齡 性別 位址 等資料成員。2 在teach...
派生類物件模型之多繼承派生類物件模型
c 是支援多繼承的,那麼多繼承關係中派生類物件模型和單繼承關係中有什麼不一樣呢?我們來看一看。首先給出乙個多繼承關係 class base1 int b1 class base2 int b2 class derive public base1,public base2 int d 類base1有乙...