1 多型:是指類中具有相似功能的不同函式,使用同乙個名稱來實現;是對類的行為再抽象;多型是通過過載函式和虛函式來實現的。
2 繼承討論的是類與類的層次關係,多型則是考慮在不同層次的類中,以及在同乙個類的內部,同名成員函式之間的關係問題,是解決功能和行為的再抽象問題。
3 多型是指類族中具有相似功能的不同函式使用同乙個名稱來實現,從而可以使用相同的呼叫方式來呼叫這些具有不同功能的同名函式。
型別:
物件導向的多型性可以分為4類:
專用多型:
(1)過載多型:普通函式以及成員函式的過載。
(2)強制多型:將乙個變數的型別加以變化。
通用多型:
(3)包含多型:研究類族中定義於不同類中的同名成員函式的多型行為,主要通過虛函式來實現。
實現:
多型從實現的角度可以分為:
(1)編譯時的多型:靜態聯編(過載、強制、引數),程式編譯連線階段完成。
(2)執行時的多型:動態聯編(包含),程式執行階段完成。
聯編:是指電腦程式自身彼此關聯的過程,就是把一條訊息和乙個物件的方法相結合的過程。
運算子過載:
運算子過載的實質是函式過載,在實現過程中,首先把指定的運算表示式轉化為對運算子函式的呼叫,運算物件轉化為運算子函式的形參,然後根據實參的型別來確定需要呼叫的函式,這個過程是在編譯過程中實現的。不能過載的運算子有5個:「.」,「*」,「::」,「? :」「sizeof」。
虛函式:
虛函式是動態聯編的基礎,虛函式是非靜態成員函式,虛函式經過派生之後,在類族中可以實現執行過程中的多型。
根據賦值相容規則,可以使用派生類物件代替基類物件。如果用基類型別的指標指向派生類物件,就可以通過這個指標來訪問該物件。問題是派生到的只是從基類繼承來的同名成員。
解決這一問題的辦法就是:如果需要通過基類的指標指向派生類的物件,並訪問某個與基類同名的成員(如果是函式,則原型完全相同)。那麼,首先在基類中將這個同名函式說明為虛函式。
這樣,通過基類型別指標,就可以使屬於不同派生類的不同物件產生不同的行為,從而實現執行過程中的多型。
一般虛成員函式實現的3個條件:
(1)首先類之間應滿足賦值相容規則。
(2)宣告虛函式。
(3)由成員函式呼叫,或者通過指標、引用來訪問虛函式。
如果使用物件名來訪問虛函式,則聯編在編譯過程中就可以通過(靜態聯編),而無需在執行中進行。
虛析構函式:
如果乙個類的析構函式時虛函式,那麼,用它派生而來的所用子類的析構函式也是虛函式。析構函式設定為虛函式之後,在使用指標,引用時就可以動態聯編,實現執行時的多型,保證使用基類型別的指標就能夠呼叫適當的析構函式針對不同的物件進行清理工作。
抽象類:
(1)抽象類是一種特殊的類,它為一族類提供統一的操作介面,通過它為乙個類族建立乙個公共的介面,使類能夠更加有效的發揮多型性。
(2)建立抽象類,就是為了通過它多型地使用其中的成員函式。
(3)抽象類處於其層次的上層,乙個抽象類自身無法實現化,而只能通過繼承機制。生成抽象類的非抽象派生類,然後例項化。但是,可以宣告乙個抽象類的指標和引用。
(4)抽象類是帶有純虛函式的類。
(5)抽象類派生出新類之後,如果派生類沒有給出全部純虛函式的實現,這時的派生類仍是乙個抽象類。
(6)純虛函式:virtual 函式型別 函式名(參數列)=0;
對C 多型的理解
物件導向三要素 封裝 繼承 多型。封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。我們應該經常會看到面試題目 請談談對多型的理解。其實呢,多型非常簡單,就一句話 呼叫同一種方法產生了不同的結果。具體實現方式有三種。一 過載 過載很簡單。public ...
對多型的理解
子類和父類彙總起來就可以成為多型。例如 父類a有乙個public許可權的方法method 子類a1,a2對該方法進行重寫 a a new a1 a a new a2 a a new a a是呼叫子類a1 a2 父類a的method方法。向上轉型 父類引用指向子類物件 父類 person 子類 stu...
C 中多型理解
封裝 繼承 多型,物件導向的三大特性,前兩項理解相對容易,但要理解多型,特別是深入的了解,對於初學者而言可能就會有一定困難了。我一直認為學習oo的最好方法就是結合實踐,封裝 繼承在實際工作中的應用隨處可見,但多型呢?也許未必,可能不經意間用到也不會把它跟 多型 這個詞對應起來。在此拋磚引玉,大家討論...