1. 程式人生 > >C++多型性的理解

C++多型性的理解

根據清華大學鄭莉老師的書《C++語言程式設計》來總結
1 多型:是指類中具有相似功能的不同函式,使用同一個名稱來實現;是對類的行為再抽象;多型是通過過載函式和虛擬函式來實現的。
2 繼承討論的是類與類的層次關係,多型則是考慮在不同層次的類中,以及在同一個類的內部,同名成員函式之間的關係問題,是解決功能和行為的再抽象問題。
3 多型是指類族中具有相似功能的不同函式使用同一個名稱來實現,從而可以使用相同的呼叫方式來呼叫這些具有不同功能的同名函式。
型別:
面向物件的多型性可以分為4類:
專用多型:
(1)過載多型:普通函式以及成員函式的過載。
(2)強制多型:將一個變數的型別加以變化。
通用多型:
(3)包含多型:研究類族中定義於不同類中的同名成員函式的多型行為,主要通過虛擬函式來實現。
(4)引數多型:與類模板相關聯。
實現:
多型從實現的角度可以分為:
(1)編譯時的多型:靜態聯編(過載、強制、引數),程式編譯連線階段完成。
(2)執行時的多型:動態聯編(包含),程式執行階段完成。
聯編:是指計算機程式自身彼此關聯的過程,就是把一條訊息和一個物件的方法相結合的過程。
運算子過載:
運算子過載的實質是函式過載,在實現過程中,首先把指定的運算表示式轉化為對運算子函式的呼叫,運算物件轉化為運算子函式的形參,然後根據實參的型別來確定需要呼叫的函式,這個過程是在編譯過程中實現的。不能過載的運算子有5個:“.”,“*”,“::”,“? :”“sizeof”。
虛擬函式:
虛擬函式是動態聯編的基礎,虛擬函式是非靜態成員函式,虛擬函式經過派生之後,在類族中可以實現執行過程中的多型。
根據賦值相容規則,可以使用派生類物件代替基類物件。如果用基類型別的指標指向派生類物件,就可以通過這個指標來訪問該物件。問題是派生到的只是從基類繼承來的同名成員。
解決這一問題的辦法就是:如果需要通過基類的指標指向派生類的物件,並訪問某個與基類同名的成員(如果是函式,則原型完全相同)。那麼,首先在基類中將這個同名函式說明為虛擬函式。
這樣,通過基類型別指標,就可以使屬於不同派生類的不同物件產生不同的行為,從而實現執行過程中的多型。
一般虛成員函式實現的3個條件:
(1)首先類之間應滿足賦值相容規則。
(2)宣告虛擬函式。
(3)由成員函式呼叫,或者通過指標、引用來訪問虛擬函式。
如果使用物件名來訪問虛擬函式,則聯編在編譯過程中就可以通過(靜態聯編),而無需在執行中進行。
虛解構函式:
如果一個類的解構函式時虛擬函式,那麼,用它派生而來的所用子類的解構函式也是虛擬函式。解構函式設定為虛擬函式之後,在使用指標,引用時就可以動態聯編,實現執行時的多型,保證使用基類型別的指標就能夠呼叫適當的解構函式針對不同的物件進行清理工作。
抽象類:
(1)抽象類是一種特殊的類,它為一族類提供統一的操作介面,通過它為一個類族建立一個公共的介面,使類能夠更加有效的發揮多型性。
(2)建立抽象類,就是為了通過它多型地使用其中的成員函式。
(3)抽象類處於其層次的上層,一個抽象類自身無法實現化,而只能通過繼承機制。生成抽象類的非抽象派生類,然後例項化。但是,可以宣告一個抽象類的指標和引用。
(4)抽象類是帶有純虛擬函式的類。
(5)抽象類派生出新類之後,如果派生類沒有給出全部純虛擬函式的實現,這時的派生類仍是一個抽象類。
(6)純虛擬函式:virtual 函式型別 函式名(引數表)=0;