C 複習3(繼承和多型)

2021-09-25 18:59:56 字數 3591 閱讀 9569

目錄

一、繼承

二、多型  

1、繼承的本質

**復用

2、繼承和派生

派生:從乙個或多個以前定義的類(基類)產生新類的過程稱為派生,這個新類稱為派生類。派生的新類同時可以增加或者重新定義資料和操作,這就產生了類的層次性。

繼承:繼承是物件導向語言的乙個重要機制,通過繼承可以在乙個一般類的基礎上建立新類,被繼承的類稱為基類,在基類上建立的新類稱為派生類。

繼承和派生其實都是一回事,只是說法不同罷了,如:子類繼承了父類,父類派生了子類。

3、特點:

1)派生類繼承了基類的什麼?

派生類繼承了除基類構造、析構以外的所有成員。

2)繼承方式:public、protect、private

3)訪問限定符:

public:在任意位置可見;

protect:在本類類中和子類類中;

private:在本類類中訪問。

基類中不同訪問限定符下的成員以不同的繼承方式繼承後在派生類中訪問

基類 繼承

public

protect

private

public

public

protect

不可訪問

(在派生類中)

protect

protect

protect

不可訪問

(在派生類中)

private

private

private

不可訪問

(在派生類中)

4、派生類的構造和析構順序

構造時:基類的構造優先順序大於派生類

析構時:先呼叫派生類的析構,再呼叫基類的析構

5、派生類物件

開闢記憶體:基類加上派生自己的記憶體

對記憶體空間初始化:

6、類和類的關係

組合:has_a     a part of (以成員變數的方式實現)

繼承:is_a      a kind of (私有繼承不是

is_a

的關係,是

has_a

的關係)

**7、同名函式的關係

函式過載(重定義)overload

函式隱藏  overhide

派生類中隱藏了基類中所有同名函式

3.函式覆蓋 override

派生類中同名同參的函式覆蓋了基類中同名同參的函式

7、基類的指標或者引用的相互指向或者引用

base *pb = &d;//基類指標可以指向派生類物件

base &rb = d;//基類的引用能引用派生類物件

derive *pd = b;//派生類的指標不能指向基類物件

derive &rb = b;//派生類的引用不能引用基類物件

1、多型的本質

介面復用    (同一介面,不同形態)

2、形式

①靜多型(在編譯期間確定函式的呼叫) 靜態繫結  屬於早繫結

優點:呼叫速度快、效率高

缺點:缺乏靈活性

函式過載和模板

②動多型(在執行期間確定函式的呼叫) 動態繫結  屬於晚繫結

虛函式(指標呼叫動態)

早繫結和晚繫結的區別?

早繫結:早繫結也稱靜態繫結,是程式在編譯時就確定呼叫的是哪個函式。

彙編指令

call base::func()

晚繫結:晚繫結也稱動態繫結,是編譯的時候才確定呼叫的是哪個函式。晚繫結基於繼承實現,基類的指標(或引用)指向派生類的物件,通過指標(或聽引用)訪問虛函式時,會呼叫指標所指向的派生類的方法。

彙編指令如下:

mov ecx,dword ptr[p]

訪問虛表指標,將虛表指標放在

ecx暫存器中

mov eax,dword ptr[ecx]

將ecx

(虛表指標)的值(虛函式表)放在

eax暫存器中

call eax

呼叫函式

在執行過程中,確定了

eax暫存器裡的值,才能確定呼叫哪個函式。

3、虛函式

1)概念:如果派生類繼承了有被vritual關鍵字修飾的函式的基類,被vritual修飾的函式稱為虛函式。派生類可以重寫該虛函式。如果派生類重寫了該虛函式,那麼派生類物件呼叫該方法時呼叫的就是派生類自己實現的方法。如果派生類沒有重寫該方法,則呼叫基類的方法。

2)虛函式表有什麼?

vftable(虛函式表)

vfptr

(虛函式指標)

優先順序最高

虛表的寫入時機: 3

)成為虛函式的條件:

①可以取位址;

②可以依賴物件呼叫。

4)哪些能成為虛函式

5)虛函式的記憶體布局

部落格:4、純虛函式

1)概念:純虛函式是特殊的虛函式,基類中不能給出這個虛函式的實現方法,派生類必須給出該函式的實現。這種特殊的函式稱為純虛函式,有純虛函式的類稱為抽象類,抽象類不能例項化物件,但是可以定義抽象類的指標或引用,派生類必須重寫方法後才能例項化物件。

2)例子:

抽象類(擁有純虛函式的類稱為抽象類)

接部落格:

5、虛析構

基類指標指向派生類物件

作用:避免通過基類指標釋放派生類物件,派生類中自己的資源沒有辦法釋放。(可以解決資源洩露的問題)

問題:

析構函式能不能寫成虛函式?

答:析構函式是可以寫成虛函式的。

2.析構函式什麼時候必須寫成虛函式?

答:當使用基類的指標指向堆上的派生類時物件時,

如:base *p = new derive(); delete p;當通過delete來釋放派生類物件的記憶體的時候,會導致派生類物件的析構函式無法呼叫,只呼叫了基類部分的析構函式,如果此時派生類的析構函式有釋放額外的系統資源的**,會直接造成資源洩露。

delete p 編譯器在編譯的時候是靜態繫結的,只呼叫基類的析構。寫成虛析構函式,就會變為動態繫結,派生類提供了自定義的析構函式,那麼虛函式表寫的就是派生類析構函式的位址,此時派生類和基類的析構函式就都可以呼叫到,解決了資源洩露的問題。

6、多型的發生時機(什麼時候發生動多型的呼叫)

1)指標呼叫虛函式;

2)物件要完整。

C 複習之繼承,多型,索引

歡迎來到unity學習 unity培訓 unity企業培訓 教育專區,這裡有很多u3d資源 u3d教程 u3d常見問題 u3d專案原始碼 我們致力於打造業內unity3d培訓 學習第一品牌。今天我們來一起複習繼承,多型和索引 還是通過習題來領略繼承的真諦 編寫乙個父類people,成員變數有姓名 i...

C 繼承和多型

在c 的物件導向的大家庭裡,我感覺繼承算是很重要的了,因為有很多的東西都是依賴於繼承和多型的,所以單獨的在第三篇部落格裡做總結和昇華。繼承在面相物件的地方是乙個很是重要的東西,可以說在物件導向的世界裡沒有了繼承就沒有了這麼多的東西,而沒有了多型就沒有了多彩的世界。類的繼承是最為普遍的事情了,可是類又...

C 繼承和多型

剛學習了c 繼承和多型,對virtual override seal override new有點了解,在此寫下這篇文章以供以後參考,若有錯誤或不足,還望各位指出。這裡有3個類,分別是grandfather father son。好,我們現在來分析一下grandfather的遺產怎麼讓father繼...