繼承的概念
繼承機制是物件導向程式設計使**可以復用的重要手段,它允許程式設計師在保持原有類特性的基礎之上進行其他擴充套件,增加功能,這樣產生的新類,稱之為派生類。
繼承呈現了物件導向程式設計的層次結構,體現了有簡單到複雜的認知過程。
class
person
protected
: string _name =
"kaiser"
;int _age =21;
}//繼承父類person的成員(包括函式和變數),都變成了子類student的一部分,並且子類還有自己新增加的變數或者函式
三種繼承方式的區別
**1.**基類的私有成員在派生類中,不可訪問,但是基類的私有成員是派生類的一部分。所以在繼承的部分,很少在基類中定義私有成員。
**2.**基類的保護成員在派生類中可見,但是其他類外的地方不可見。
**3.**無論哪一種繼承方式,都不會影響基類的正常使用。
**4.**如果繼承方式沒寫,那麼class的預設繼承方式是private繼承,struct的預設繼承方式是public繼承
切片操作
派生類物件、指標、引用可以直接賦值給基類物件、指標。引用
person p;
student s;
p = s;
person& p1 = s;
person* p2 =
&s;
注意:
**1.**基類物件不能賦值給派生類物件
**2.**基類指標、引用可以用強制型別轉換賦值給派生類指標、引用(但是存在不安全情況,要看賦值的基類的指標、引用的具體指向是否是派生類)
下圖中紅色是強制轉換不安全情況
綠色是強制轉換安全情況
藍色是切片操作
同名隱藏
class
person
class
student
:public person
void
setnum2
(int num)
void
showid()
protected
:int num;
int id =
100;
}
上方**中setnum函式中num是乙個區域性變數,並不是student類中的成員變數num,所以呼叫setnum函式不影響成員變數num的值;setnum2函式才有改變成員變數num效果;
person和stdent的id成員變數是兩個不同的變數,呼叫showid函式,列印結果是100。
小結:
3. 同名隱藏發生在不同作用域下,同作用域下叫函式過載;
4. 父類和子類中有同名的成員,子類只能看到自己的成員,如果需要訪問父類的成員,需要加上父類的作用域;
5. 成員變數隱藏:成員變數名相同;
6. 函式名相同,父類子類作用域不同構成函式隱藏,與引數個數無關;
7. 只要不同作用域下,有同名成員,當前作用域下的這個名稱的成員就會覆蓋其他同名成員,該機制不是繼承獨有的。
繼承中的成員函式
子類的建構函式
一定會呼叫父類的建構函式
a. 如果不顯式呼叫,自動呼叫父類的預設構造;
b. 如果顯式呼叫,則呼叫顯式指定的父類構造;
繼承自父類的成員變數,一定要通過父類的建構函式完成初始化,在子類的初始化列表中只能顯式初始化子類新增的成員變數;
初始化順序:一定是先初始化父類的成員,再初始化子類的成員;
建立子類物件時,首先呼叫子類的建構函式,在子類建構函式的初始化列表中呼叫父類的建構函式,先執行父類的構造邏輯,再執行子類的構造邏輯;
子類的拷貝建構函式
預設行為(沒有顯式定義子類的拷貝構造):呼叫父類的拷貝構造;
顯式定義子類的拷貝構造的預設行為(沒有顯式呼叫父類的拷貝構造):呼叫父類的預設構造;
在子類的拷貝構造中可以指定呼叫哪乙個父類的建構函式,可以是拷貝建構函式,也可以是其他建構函式;
子類的賦值運算子過載函式
預設行為:呼叫父類的賦值運算子過載函式;
顯示定義:和父類的賦值運算子構成同名隱藏;
建議呼叫父類的賦值運算子,可以使**復用;
子類的析構函式
1.編譯器自動生成的析構函式自動呼叫父類析構函式;
2.顯式定義的子類析構函式自動呼叫父類析構函式;
3.無論子類析構函式是否顯式呼叫父類析構函式,編譯器都會自動呼叫一次父類的析構函式;
4.子類析構函式和父類析構函式底層函式名相同,構成函式隱藏;
注意:父類析構函式不需要在子類中顯式呼叫,防止資源二次釋放問題。
友元關係不能繼承
基類靜態成員無論經過多少次繼承,都只有乙個例項物件
菱形繼承問題
菱形繼承存在資料冗餘和二義性的問題,如上圖,assistant類中有person類成員兩份
解決方法:以上圖為例,讓student和teacher虛擬繼承person,class student : virtual public person,class teacher : virtual public person。這樣的話assistant中就只有乙份person類的成員了
虛基表和虛基表指標
在虛擬繼承中,存在虛基表指標和和虛基表,虛基表指標指向虛基表的首位址,虛基表中存放虛基表指標的位址到公共成員的偏移量。
通過用指標的大小換取重複成員的大小,重複的成員越多,越能看出虛擬繼承的好處。
C 繼承總結
繼承是物件導向程式設計中軟體重用的關鍵技術。繼承機制使用已定義的類作為基礎建立新的類定義,新的類是原有類的資料及操作與新類所增加的資料及操作的組合。新的類把原有的類作為基類引用,而不需要修改原有類的定義。新的類作為派生類引用。這種可擴充 可重用技術大大降低了大型軟體的開發難度。c 中描述類繼承關係的...
C 繼承總結
一 基類和派生類 類繼承關係的語法形式 class 派生類名 基類名錶 資料成員和成員函式說明 其中,基類名錶 的語句格式如下 訪問控制 基類名1,訪問控制 基類名2,訪問控制 是表示繼承許可權的關鍵字,稱為訪問描述符。可以是 如果省略訪問描述符,則c 認為是私有繼承。如果用關鍵字struct 而不...
C 繼承總結
繼承概念 在原有的類不變的基礎之上,新增一些函式,對功能進行拓展 繼承特點 是物件導向程式設計的的層次結構 是實現由簡單到複雜的認知過程 基類 被繼承的類 派生類 在繼承之後產生的新類 例子 手機系統會不斷更新,然而,我們的手機更新之後的功能只是對原來的功能進行優化和新增 繼承格式 派生類名 繼承許...