C 繼承總結

2021-10-08 15:13:24 字數 3459 閱讀 8985

繼承的概念

繼承機制是物件導向程式設計使**可以復用的重要手段,它允許程式設計師在保持原有類特性的基礎之上進行其他擴充套件,增加功能,這樣產生的新類,稱之為派生類。

繼承呈現了物件導向程式設計的層次結構,體現了有簡單到複雜的認知過程。

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 繼承總結

繼承概念 在原有的類不變的基礎之上,新增一些函式,對功能進行拓展 繼承特點 是物件導向程式設計的的層次結構 是實現由簡單到複雜的認知過程 基類 被繼承的類 派生類 在繼承之後產生的新類 例子 手機系統會不斷更新,然而,我們的手機更新之後的功能只是對原來的功能進行優化和新增 繼承格式 派生類名 繼承許...