1. 程式人生 > >【C++學習筆記】多型性

【C++學習筆記】多型性

今天我們來講一下面向物件的程式設計的第三個特點:多型性。

所謂多型性就是不同物件收到相同的訊息時,產生不同的動作。多型性有下面兩種描述:
1.具有不同功能的函式可以用同一個函式名。(過載、虛擬函式)
2.向不同的物件傳送同一個訊息,不同物件在接收訊息後產生的行為不同。

多型有三種實現形式:
函式過載
運算子過載
虛擬函式

多型的分類:

在這裡插入圖片描述

聯編的概念

聯編就是把函式名和函式程式碼連線在一起的過程。

靜態與動態的概念

靜態聯編:在編譯階段完成的聯編(由於是在編譯開始的時候就已經完成,所以在程式執行過程中是固定不會變的。)
動態聯編:在執行階段完成的聯編。(可以在程式執行中動態改變)

由於引出了靜態聯編與動態聯編的概念,接下來再與多型性結合引出下面概念:
在靜態聯編時體現的多型就被稱為編譯時的多型。此時,系統將實參與形參進行匹配,對於同名過載函式便根據引數上的差異進行區分,然後進行聯編。從而實現多型性。
在動態聯編時體現的多型稱為執行時的多型。此時,當函式呼叫到某一程式名時,才去尋找和連線其程式的程式碼,對面向物件的程式設計而言,就是接收到某一訊息後,才去尋找相應連線方法。

打個比方:把計算機想象成一個維修工,有一類維修工習慣在上工前先把工具組裝除錯好再一起帶到現場(編譯時的多型)。而有一類維修工習慣人先過去,看到實際問題後再慢慢組裝工具,根據現場實際問題組裝不同的工具(執行時的多型)。

這樣比喻我們就容易看出這兩種方式處理問題的利弊了:第一類維修工在工作時效率更高(工具都已經準備好了,直接使用就好了)但是一但現場出現了超出維修工預料的問題,手頭工具不能用了,就沒辦法改變了。第二類維修工在工作時可以根據實際問題靈活的組裝工具,但是每次使用都要組裝一次工具,所以工作效率低。

在程式中編譯時的多型保證了效率但靈活性差,執行時的多型保證了靈活性但犧牲了效率。

第一類維修工:編譯性語言(C、C++…)
第二類維修工:解釋性語言(python…)

但是
C++:年輕人才做選擇,大人全都要!

C++雖然是編譯性語言,但是C++引入了虛擬函式機制,使得C++擁有了動態聯編的功能。也就是說,C++是一個靜態與動態結合的語言。
在C++中,編譯時的多型性體現在函式的過載和運算子過載。執行時的多型是利用虛擬函式。