多態性(Polymorphism)
指一個名字,多種語義;
一個介面,多種方法
• 所謂多態性是指當不同的對象收到相同的訊息時,
產生不同的動作。
• C++的多態性具體體現在
運行和編譯兩個方面:
在程式運行時的多態性通過繼承和虛函數來體現;
在程式編譯時間多態性體現在函數和運算子的重載上
Ø 虛函數是在基類中冠以關鍵字 virtual 的成員函數。
它提供了一種介面介面。
Ø 虛函數可以在一個或多個衍生類別中被重定義。 Ø 實現運行時多態的關鍵首先是要說明虛函數,
必須用基類指標調用衍生類別的不同實現版本
虛函數的作用:
允許在衍生類別中對基類的虛函數重新定義。
Ø能用virtual聲明類的成員函數,只能用於類的繼承階層中。
不能將類外的普通函數(友員)和靜態成員函式宣告成虛函數。
建構函式不能聲明為虛函數!
Ø 在衍生類別中重新定義虛函數,要求函數名、函數類型、函數參
數個數和類型全部與基類的虛函數完全相同。
否則不能實現多態性, 為函數重載.
Ø一個成員函數被聲明為虛函數後,在同一類族中的不能再定義 與該虛函數具有相同的參數和傳回型別的非virtual同名函數。 Ø 衍生類別中可以根據需要重新定義虛函數,保持虛函數特性;
如果沒有對基類的虛函數重新定義,則衍生類別簡單地繼承其直 接基類的虛函數。
Ø在衍生類別中重新定義虛函數
函數名、傳回型別、 參數個數、 參數類型和順序完全相同
如果衍生類別中對虛函數定義不同的參數,就無法實現多態機制。
Ø在衍生類別中重載基類同名函數
如果函數原型不同,僅函數名相同,丟失虛特性
基類中的函數為 virtual void show() const,
衍生類別中的函數為void show (),
Ø 建構函式不能是虛函數
建立一個衍生類別對象時,必須從類層次的根開始,
沿著繼承路徑逐個調用基類的建構函式
Ø 解構函式可以是虛函數
虛解構函式用於指引 delete 運算子正確析構動態對象
l純虛函數的作用
在基類中為其衍生類別保留一個函數的名字,
以便衍生類別根據需要對它進行定義。
作為介面而存在
l純虛函數不具備函數的功能,一般不能直接被調用。
從基類繼承來的純虛函數,在衍生類別中仍是虛函數。
l如果一個類中至少有一個純虛函數,那麼這個類被稱為抽象類別(abstract class)。
抽象類別中不僅包括純虛函數,也可包括虛函數。
l抽象類別必須用作派生其他類的基類,而不能用於直接建立對象執行個體。
但仍可使用指向抽象類別的指標支援運行時多態性。
l衍生類別中應重載基類中的純虛函數,否則它仍將被看作一個抽象類別。l抽象類別不能用作函數參數類型、函數傳回值類型或顯式轉換的類型。
可以聲明抽象類別的指標和引用。
l由於抽象類別的解構函式可以被聲明為純虛函數。Ø虛函數和多態性使成員函數根據調用對象的類型產生不
同的動作.
Ø 多態性特別適合於實現分層結構的軟體系統,
便於對問題抽象時定義共性,實現時定義區別 .
(4) 抽象基類是本類族的公用介面。
即從同一基類派生出的多個類有同一介面。
(5) 如果在基類聲明了虛函數,則在衍生類別中凡是與該函數有相同的函數名、函數類型、參數個數和類型的函數,均為虛函數。