C++多型性

鴨脖發表於2012-04-21
對C++多型學習的一點感受   
原創:郭萌     2002年9月3日     
  


多型考慮的是類與類之間的層次關係以及類自身內部特定成員函式之間的關係問題,是解決功能和行為的再抽象問題。多型是指類中具有相似功能的不同函式是用同一個名稱來實現,從而可以使用相同的呼叫方式來呼叫這些具有不同功能的同名函式。這也是人類思維方式的一種直接模擬,比如一個物件中有很多求兩個數最大值的行為,雖然可以針對不同的資料型別,寫很多不同名稱的函式來實現,但事實上,它們的功能幾乎完全相同。這時,就可以利用多型的特徵,用統一的標識來完成這些功能。這樣,就可以達到類的行為的再抽象,進而統一標識,減少程式中識別符號的個數。 

物件導向的多型性可以嚴格的分為四類:過載多型,強制多型,包含多型,和引數多型,前面兩種統稱為專用多型,而後面兩種也稱為通用多型。 

包含多型是研究類族中定義於不同類中的同名成員函式的多型行為,主要是通過虛擬函式來實現。引數多型與類屬(類别範本)相關聯,類屬是一個可以引數化的模板,其中包含的操作所涉及的型別必須用型別引數例項化。這樣,由類别範本例項化的各類都具有相同的操作,而操作物件的型別卻各不相同。 

多型從實現的角度來講可以劃分為兩類,編譯時的多型和執行時的多型。前者是在編譯的過程中確定了同名操作的具體操作物件,而後者則是在程式執行過程中才動態的確定操作所針對的具體物件。這種確定操作的具體物件的過程就是聯編,也有的文獻成為編聯,束定或繫結。聯編是指計算機程式自身彼此關聯的過程,也就是把一個識別符號名和一個儲存地址聯絡在一起的過程;用物件導向的術語講,就是把一條訊息和一個物件的方法相結合的過程。按照聯編進行的階段的不同,可以分為兩種不同的聯編方法:靜態聯編和動態聯編,這兩種聯編過程分別對應著多型的兩種實現方式。 

聯編工作在編譯連線階段完成的情況成為靜態聯編。因為聯編過程外程式開始執行之前進行的,因此有時也稱為早期聯編或前聯編。在編譯,連線過程中,系統就可以根據型別匹配等特徵確定程式中操作呼叫與執行該操作程式碼的關係,其確定了某一個同名標識到底是要呼叫那一段程式程式碼。有些多型型別,其同名操作的具體物件能夠在編譯,連線階段確定,通過靜態聯編解決,比如過載,強制和引數多型等。 

和靜態聯編相對應,聯編工作在程式執行階段完成的情況稱為動態聯編,也稱為晚期聯編或後聯編。在編譯,連線過程中無法解決的聯編問題,要等到程式開始執行之後再來確定,包含多型的操作物件的確定就是通過動態聯編完成的。 

相關文章