阿牛哥C 筆記 10

2021-05-02 12:04:24 字數 2065 閱讀 5313

第四十三講 虛函式

class a

;class b: public a

;class c: publid b

;不同層次完全一樣的函式頭

c類中將會有三個output函式

void main()

完全一樣的函式頭,無法根據引數來區分

執行時能根據不同的物件選擇不同的output()函式,這種性質叫

做執行時多型

覆蓋機制

指當我們的派生類當中自定義的成員函式如果和從基類中繼承下

來的成員函式頭完全一樣,用派生類當中的成員函式覆蓋掉基類

中的成員的函式

避免了二義性,根據物件來區分,可以看出是呼叫的哪個類的函

數另外,改一下主函式,看一如下例子

void main()

本義是想輸出a,b,c三個不同的output

事實上只會輸出a的output

不能根據不同尖物件選擇對應的output()函式,不具備多型性

再看如下例子

void function(a &a)

void main()

輸出結果仍然是物件a的output,也是不能根據物件選擇對應的

output函式

如何解決不具備多型性的問題

虛函式機制

在類中特別是基類的中定義成員(同名的函式)時前面加上

virtual關鍵字

用到虛函式的地方

當某個函式在不同層次的類中完全相同時,在程式執行時根據不

同物件,應該呼叫哪個層次的函式,

通過指標呼叫函式時,如果不加virtual關鍵字,函式只具備一

態性,(此情況下,所呼叫的函式在指標或引用的類中),加上

virtual後,指向的物件不同,則呼叫的函式所在的層次不同,

由物件所在的類來決定。

過載的時候,我們可以用引數的個數和型別來區分同名的函式

而在這裡函式名和引數都相同

第四十四講 實驗

目的驗證覆蓋機制

驗證虛函式機制

基類的物件可以引用派生類的物件,而派生類的物件不能引用基

類的物件

注意點1,當我們用物件來呼叫函式時,不用引入虛函式,因為有覆蓋機

制2,當我們沒有引入虛函式時,能過指標呼叫output函式,只能指

針類當中的output函式,或者是引用類的output函式

3,當我們引入虛函式機制後,不管是派生類的還是基類的指標,

都可以指向他們任何類的物件,並且它指向哪個物件就指向那個

類的output函式,或者是所屬類的output函式。

4,如果是基類指標指向類派生類時,雖然型別不一致,但系統會

自動轉換,反過來派生類指標,指向基類的時候,不相容,要自

己進行強制型別轉換

#include

class a

;void a::output()

;void b::output()

;void c::output()

void main()

/*void main()

*//*

void main()

*/第四十五講 抽象類

別人只想繼承函式名,不想繼承函式的功能。重寫這個函式,實

現不同的功能。

只寫乙個基類,定義一些成員作灶虛函式,而不實現函式,即什

麼也沒有,專門讓人來繼承重寫,定義為虛函式,叫純虛函式,

這個基類叫抽象類。

抽象類提供了一些公共的介面,繼承抽象類的派生類,如果要定

義物件,必須實現這些介面的**。

必須要重寫純虛函式,

抽象類不能定義物件,但可以定義抽象類的指標,這樣就可以通

過指標實現多型性了。

抽象類可以派生出新的抽象類,也可以派生出具體類。

格式 沒有函式體,讓函式頭等於0.

好了,課程結束了

感覺阿牛哥講的不錯,很精簡,拋開了和c重複的內容,只講面

向物件,和c++的關鍵的幾個機制。我這個筆記沒有寫自己的一

些心得,一是因為以前對c++一點概念也沒有,先打個基礎,然

後這機制搞清楚

接下來找時間回過頭複習一下吧

阿牛哥C 筆記 3

阿牛哥c 第十四講 實驗三 物件的釋放方法,析構函式的使用 析構函式前加 和類名相同 沒有引數 且是唯一的 不能過載 實現系統會自動的呼叫析構函式。指標變數會自動的釋放記憶體空間,所以沒有析構的說法 include include strcpy head file class cstudent 習慣...

阿牛哥C 筆記 4 1

第二十講 友元函式 定義乙個函式不是本類的函式,但可以訪問本類的成員。那需要在類中定義這個為友元函式 宣告格式 friend void visit 實驗 二十講 友元函式的使用方法 想用乙個普通函式來操作定義物件的資料成員。在類當中宣告變通函式是這個類的友元函式 include include st...

阿牛哥C 筆記 9

第四十二講 虛基類 class a void a inputa int xx class b void b inputb int xx class c public a,public b void c output 輸出的x是哪個呢 編譯應該會出錯了 那麼要修改output函式 void c out...