《實用C 》第42課 多型性與虛函式

2021-09-03 07:18:04 字數 1477 閱讀 8936

1、多型性介紹:

關於c++中物件導向的多型特性,這裡面先給大家介紹一下。什麼是多型性?多型,即多種形態。在c++中一般是這麼解釋的:向不同的物件傳送同乙個訊息,不同的物件在接收時會產生不同的行為。

之前其實已經給大家有使用過了,就是成員函式的過載,或者運算子的過載等等,都算是多型性的一種體現。

舉個現實中的例子,我們還拿學生來做舉例:說上課了,那麼不同的學生可能會走進不同的教室,上課了,有的學生上語文課,有的學生上數學課,等等。所以針對同乙個上課的訊息,不同的學生產生的行為是不一樣的。大家明白了嗎?

2、使用虛函式實現多型:使用基類之指標,指向派生類的物件,呼叫虛函式的時候,最後呼叫的是派生類的函式!

①、分別給 cstudent、cxiaostudent、czhongstudent 三個類新增 shangke() 這麼個成員函式;

②、分別在三個類的 shangke 函式中列印出不同的文字內容,以示區別;

③、測試如下**:

int main(int argc, char* argv)

跟大家猜想的結果一致嗎?

stud_zhong.shangke(); 列印的結果是 czhongstudent::shangke 函式,pstud->shangke(); 列印的結果是 cstudent::shangke 的結果。因為我雖然用的是基類的指標 pstud 指向了派生類的物件,但是本身基類也有同名該函式,所以就呼叫了跟指標同型別的基類的 cstudent::shangke 的函式了;

④、這裡面我改寫一下,把 cstudent 的 shangke 函式宣告成 virtual 虛函式,如下:

virtual void shangke()

之後我們其他不動,再來看看**的執行結果?大家看到了嗎?結果不一樣了吧?兩次呼叫的都是 czhongstudent::shangke 函式。這就是 virtual 虛函式的妙用!

3、虛函式的注意事項:

①、virtual 只能用來宣告類的成員函式,把它作為虛函式,而不能將類作用域外的普通函式宣告成虛函式。因為虛函式的作用是允許在派生類中對基類的虛函式重新定義。顯然,他只能用於類的繼承層次結構中;

②、乙個類中的某個函式被宣告成虛函式之後,同一類中就不能再定義乙個非virtual的引數和返回值型別都相同的成員函式了。

4、什麼情況下使用虛函式:

一般情況下是某個函式所在的類可能會作為父類/基類,而且該函式有可能會被派生類重寫,並被派生類使用,那麼這個時候就可以考慮將該函式宣告為 virtual 虛函式。否則就不用!因為宣告成虛函式之後是有開銷的,所以不要隨隨便便的想宣告成虛函式就宣告。

5、小作業:

建立乙個狗的類 cdog,包含 wangwang 這個虛函式,之後從 cdog 分別派生2-3個子類,比如:有金毛、吉娃娃、藏獒 等。分別實現每個子類的 wangwang 方法,之後試著呼叫該方法,充分理解虛函式的特性!

C 多型性與虛函式

物件導向程式設計中的多型性是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了 乙個介面,多種方法 從實現的角度來講,多型可以分為兩類 編譯時的多型性和執行時的多型性。前者是通過靜態聯編...

C 多型性 與 虛函式

1.運算子過載 運算子過載形式 1 過載為類的成員函式 運算子過載函式說明為類的成員函式的格式為 類名 operator 運算子 參數列 如 c1 c2 編譯器將給出的解釋為 c1.operator c2 該運算子過載函式僅僅有乙個引數,所以過載為成員函式時,雙目運算子僅有乙個引數。對於單目運算子,...

C 多型性與虛函式

多型性是物件導向程式設計的關鍵技術之一。利用多型性技術,可以呼叫同乙個函式名的函式,實現完全不同的功能。若程式語言不支援多型性,不能稱為物件導向的語言。在c 中有兩種多型性 1 定義格式 虛函式是乙個類的成員函式,定義格式如下 virtual 返回型別 函式名 參數列 說明 2 通過虛函式實現多型性...