多型和過載

2021-06-08 03:37:43 字數 1609 閱讀 7140

一.多型

(鏈結機制)

多型(polymorphism)按字面的意思就是「多種形狀」。引用charlie calverts對多型的描述——多型性是允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作(摘自「delphi4 程式設計技術內幕」)。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。多型性在object pascal和c++中都是通過虛函式(virtual function) 實現的。

多型性是允許將父物件設定成為和乙個和多個它的子物件相等的技術,比如parent:=child; 多型性使得能夠利用同一類(基類)型別的指標來引用不同類的物件,以及根據所引用物件的不同,以不同的方式執行相同的操作.

多型的作用:把不同的子類物件都當作父類來看,可以遮蔽不同子類物件之間的差異,寫出通用的**,做出通用的程式設計,以適應需求的不斷變化。

賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。

舉個例子:從乙個基類中派生,響應乙個虛命令,產生不同的結果。

比如從某個基類繼承出多個物件,其基類有乙個虛方法tdoit,然後其子類也有這個方法,但行為不同,然後這些子物件中的任何乙個可以附給其基類的物件,這樣其基類的物件就可以執行不同的操作了。實際上你是在通過其基類來訪問其子物件的,你要做的就是乙個賦值操作。

使用繼承性的結果就是可以建立乙個類的家族,在認識這個類的家族時,就是把匯出類的物件 當作基類的的物件,這種認識又叫作upcasting。這樣認識的重要性在於:我們可以只針對基類寫出一段程式,但它可以適 應於這個類的家族,因為編譯器會自動就找出合適的物件來執行操作。這種現象又稱為多型性。而實現多型性的手段又叫稱動態繫結(dynamic binding)。

簡單的說,建立乙個父類的變數,它的內容可以是這個父類的,也可以是它的子類的,當子類擁有和父類同樣的函式,當使用這個變數呼叫這個函式的時候,定義這個變數的類,也就是父類,裡的同名函式將被呼叫,當在父類裡的這個函式前加virtual關鍵字,那麼子類的同名函式將被呼叫

class a

virtual void foo()

};class b : public a

void foo()

};int main(int argc, char* argv)

這將顯示:

this is b.

如果把virtual去掉,將顯示:

this is a.

前面的多型實現使用抽象類,並定義了虛方法.

二.過載

(編譯機制)

過載決策是一種編譯時機制,用於在給定了引數列表和一組候選函式成員的情況下,選擇乙個最佳函式成員來實施呼叫。函式過載就是乙個類中有幾個同名函式但參數列不同:

過載分為普通方法過載和基類(也就是父類)虛方法的過載!

普通方法的過載指的是:類中兩個以上的方法(包括隱藏的繼承而來的方法),取的名字相同,但使用的引數型別或者引數個數不同!

對基類方法的過載是函式過載的另一種特殊形式。在派生類中重新定義此虛函式!方法名稱,返回值型別,參數列中的引數個數,型別,順序都必須和基類中的虛函式完全一致!在派生類中宣告對虛方法的過載,要求在宣告中加上override關鍵字,而且不能有new,static或virtual修飾符!

過載和多型

多型 多型是建立在重寫基礎之上,子類重寫父類方法 類之間 多型的三個條件 繼承 重寫 父類引用指向子類物件。函式名相同,函式形參相同。呼叫時根據函式型別是虛函式還是普通函式決定呼叫哪乙個。若父類中的函式被定義為虛函式,則子類對該函式的實現被稱為函式的重寫。可以通過指標訪問每乙個方法,這叫做覆蓋。若函...

區分多型和過載

多型是基於對抽象方法的覆蓋來實現的,用統一的對外介面來完成不同的功能。過載也是用統一的對外介面 來完成不同的功能。那麼兩者有什麼區別呢?過載,是指允許存在多個同名方法,而這些方法的引數不同。過載的實現是 編譯器根據方法不同的參數列 對同名方法的名稱做修飾。對於編譯器而言,這些同名方法就成了不同的方法...

區別多型和過載

過載可認為是靜態的多型,靜態聯編,發生在編譯階段 多型是動態的,動態聯編,發生在執行階段 靜態的比動態的效率高,但動態的最大優點是多型性,提高 復用性。1 實現多型公有繼承有兩種機制 第一種是 在派生類中重新定義基類方法。重新定義的方法和基類中的方法完全一致。即,函式名一致,函式的返回值型別一致,引...