過載不應歸在多型的範疇內

2021-07-30 19:29:31 字數 905 閱讀 2425

什麼是多型?

簡而言之,是指多個屬於不同類的物件 對同一方法呼叫做出不同響應的方式。

(感覺還是有點繞口)

舉個例子,所有的動物都能發出聲音(把發出聲音這一行為抽象為乙個方法:sound();),但是不同種類的動物發出的聲音卻是不一樣的(呼叫sound()方法能夠得到不同的響應)。

一談到多型,很多人就聯想到過載(overload),但我並不覺得過載在多型的範疇之內。

過載,是指允許存在多個同名方法,而這些方法的引數不同。過載的實現是:編譯器根據方法不同的參數列,對同名方法的名稱做修飾(比如過載方法method(int i);和method(char i);在編譯器的眼中就可能變為int_method(int i);和char_method(char i);)。對於編譯器而言,這些同名方法就成了不同的方法。它們的呼叫位址在編譯期就繫結了。

多型:是指子類重新定義父類的虛方法(virtual,abstract)。當子類重新定義了父類的虛方法後,父類根據賦給它的不同的子類,動態呼叫屬於子類的該方法,這樣的方法呼叫在編譯期間是無法確定的。

不難看出,兩者的區別在於編譯器何時去尋找所要呼叫的具體方法,對於過載而言,在方法呼叫之前,編譯器就已經確定了所要呼叫的方法,這稱為「早繫結」或「靜態繫結」;而對於多型,只有等到方法呼叫的那一刻,編譯器才會確定所要呼叫的具體方法,這稱為「晚繫結」或「動態繫結」。

於是,就有人將過載視為靜態多型,他們認為過載仍舊符合多型的廣義——通過單一介面來實現不同特定行為的能力。

但是,我還是不贊成將過載歸於多型的範疇之內。

我們都知道多型是屬於物件導向的三大特性之一,而過載卻不一定是物件導向程式設計語言裡才有的東西,只要編譯器支援,結構化語言也可以實現這種所謂的過載。過載只是一種語言特性,與多型無關,與物件導向無關。

所以我認為多型的表現應該是方法位址在執行期繫結,而不是在編譯期確定的。

繼承,多型,過載的區別

學習隨手記。過載 同一方法或者構造器的獨一 各種引數型別 的排序組合,所能用的方法。其中構造器可以起到初始化類的作用,以便通過構造器設定類的不同例項。繼承 為了復用 而具體化自超類的子類。多型 為了類之間解耦而做的設計。greentea tiguanyin new greentea 例項化乙個物件,...

C 過載與多型的區別

過載 有兩個或多個函式名相同的函式,但是函式的形參列表不同。在呼叫相同函式名的函式時,根據形參列表確定到底該呼叫哪乙個函式。多型 在基類中定義了乙個虛函式,然後在派生類中又定義乙個同名,同參數列的函式,這就是多型。多型是這3種情況中唯一採用動態繫結技術的一種情況。也就是說,通過乙個基類指標來操作物件...

重寫 覆蓋 過載 多型的區別

override 重寫 覆蓋 overload 過載 polymorphism 多型 override是重寫 覆蓋 了乙個方法,以實現不同的功能。一般是用於子類在繼承父類時,重寫 重新實現 父類中的方法。重寫 覆蓋 的規則 1 重寫方法的引數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是過...