最近開始學設計模式,進度有些慢,不知不覺中這個專案拖了好長時間,不過、套用一位網編朋友說過的話,雖然個人感覺這話有些—— ——另類:
我不是不奮鬥的人,菇娘奮鬥起來不是人。o(∩_∩)o哈哈,下面進入正題:
那麼問題來了:什麼是多型?好搜百科稱之曰:
多型(polymorphism)按字面的意思就是"多種狀態"。在物件導向
語言中,介面的多種不同的實現方式即為多型。引用charlie calverts對多型的描述--多型性是允許你將父物件設定成為和乙個或更多的他的
子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作(摘自"delphi4 程式設計技術內幕")。簡單的說,就是一句話:允許將子類型別的
指標賦值給父類型別的指標。多型性在object pascal和c++中都是通過
虛函式(virtual function) 實現的。
解釋的挺清楚的,但是還是有一些細節需要深究一下。
子類重寫父類方法,然後用父類的引用指向子類物件,呼叫方法時進行動態繫結,這就是多型。
最常見的用法就是宣告基類的指標,利用指標指向子類物件,呼叫相應的虛函式(明確:呼叫基類的虛方法利用指標來執行派生類的具體操作),可以根據指向的子類的不同而實現不同的方法(明確:不同的物件通過自己的**來執行相同的動作)。如果沒有使用虛函式的話,就沒有利用c++多型性,則利用基類指標呼叫相應的函式的時候,將總是被限制在基類函式本身,而無法呼叫到子類中被重寫過的函式。因為沒有多型性,函式呼叫的位址將是一定的,而固定的位址將始終呼叫到同乙個函式,這就無法實現乙個介面,多種方法的目的了。多型是為了介面重用:不管傳遞過來的是哪個類的物件,函式都能夠通過同乙個介面(利用基類指標)呼叫到適應各自物件的實現方法。
有乙個父類superperson,它有subcindy,subkindy兩個子類
sprclass有乙個方法 name(),兩個子類都重寫了這個方法
那麼我們可以定義乙個superpersom的引用born,讓它指向乙個子類的物件,
比如superperson born = new subcindy();那麼我們呼叫born.name()方法時候,會進行動態繫結
也就是born它的實際型別的name()方法,即subcindy的name()方法。
這個例子也就是書上說的:多型的原理是當方法被呼叫時,無論物件是否被轉換為其父類,都只有位於物件繼承鏈最末端的方法實現會被呼叫,也就是說,虛方法是按照其執行時型別而非編譯時型別進行動態繫結呼叫的。
上面提到了「重寫」現在就簡要介紹一下:
一名方法覆蓋
是子類對父類的函式進行重新定義
可用super關鍵字,引用了當前類的父類
子類函式的訪問修飾許可權不能少於其父類
如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫
讓類以統一的方式處理不同型別資料
類中可以建立多個方法,相同的名字,不同的引數和不同的定義。
呼叫方法時通過傳遞給他們的不同引數個數和型別絕的具體使用哪個方法
(1)如果子類函式與父類函式同名,但引數不同,不管有無virtual關鍵字,子類函式將會被隱藏 (注意別與過載混淆)
(2)如子類的函式與父類函式同名,且引數也相同,但是子類沒有virtual關鍵字,子類函式將被隱藏(注意別與覆蓋混淆)
指標 C之精華 續1
1 先取 p值,後使p值加1 p 與 p 等價。和 同優先順序,結合方向自右而左 2 先使p值加1,後取 p值 p 1 用陣列名做函式引數 c編譯時將形參陣列名 作為指標變數來處理的,所以以下2個函式的定義是等價的 f int arr int n f int arr,int n 2 多維陣列與指標 ...
多型之重寫
一 先定義乙個被重寫類jisuan,重點是用關鍵字virtual using system using system.collections.generic using system.linq using system.text using system.threading.tasks namesp...
精華總結 機器視覺硬體之鏡頭
內容提要 1.鏡頭定義 介紹光學鏡頭的定義 2.鏡頭分類 從球面鏡到非球面鏡,從定焦到變焦,從短焦到長焦,盡可能 多的闡述鏡頭種類 3.鏡頭引數 以computar鏡頭為例,例項分析鏡頭引數 4.鏡頭成像影響因子 分析影響鏡頭成像各種工藝誤差 5.工業鏡頭常見種類 羅列幾種常用的工業鏡頭 6.鏡頭選...