1. 程式人生 > >第十二章 多態性與抽象類

第十二章 多態性與抽象類

mil 虛構函數 函數聲明 關聯 抽象類 表示 純虛函數 首部 定義

第十二章 多態與虛函數

一、多態的概念

向不同的對象發送同一個消息,不同的對象在接收時會產生不同的行為

具有不同功能的函數名可以用同一個函數名,以實現用一個函數名調用不同內容的函數

*靜態多態和動態多態(編譯時的多態性和運行時的多態性)

靜態多態的特點:調用速率快、效率高,但缺少靈活性,在程序運行前就已經決定了執行的函數和方法

動態多態的特點:不在編譯時確定調用的是哪個函數,只有在程序運行時才動態確定操作所針對的對象。動態多態是通過虛函數實現的。

二、利用虛函數實現動態多態性

*虛函數的作用

函數重載處理的是同一層次上的同名函數問題,而虛函數處理的是不同派生層次的同名函數問題,前者是橫向重載

,後者可以理解成是縱向重載。(不同點:同一類族虛函數首部是相同的,而函數重載時的函數是不同的(這裏指函數參數個數或類型不同))

*靜態關聯與動態關聯(早期關聯與滯後關聯)

*虛函數聲明

1.只能用virtual聲明類的成員函數,把它作為虛函數

2.一個成員函數配聲明為虛函數後,在同一類族就不能再定義一個非virtual 且函數首部相同的函數

3.考慮事項:

(1)如果成員函數在類的繼承後出現功能的更改一般聲明為虛函數

(2)如果通過基類指針或者引用去訪問,則應當聲明為虛函數

(3)有時會定義空函數體的虛函數,留給派生類添加

*虛析構函數

當基類有非虛析構函數時,只執行基類的析構函數,不執行派生類的析構函數。如果希望能執行派生類的析構函數,可以講基類的析構函數聲明為虛構函數,此時,該基類所有的派生類的析構函數都自動成為虛函數,即使派生類與基類的析構函數名不同。

註:構造函數不能聲明為虛函數

三、純虛函數與抽象類

1.純虛函數概念

對於基類的虛函數不作任何處理的情況的一種簡化形式

virtual 函數類型 函數名(參數表)= 0

註意:純虛函數沒有函數體;最後的=0不表示函數返回值為0,只起形式作用;

2.抽象類

含有純虛函數的類就是抽象類

只用來派生,不用來生成定義對象

四、結論

1.某基類包含一個或多個純虛函數,就是抽象類

2.抽象類一般不是現實存在的對象的抽象

3.在類的層次結構中,頂層或最上面幾層都可以是抽象類

4.抽象基類是本類族的共用接口,或者說是從同一基類派生出的多個類有同一接口,因此,能響應同一形式的消息。

5.如果基類聲明了虛函數,則在派生類中出現首部相同的函數均為虛函數(默認)

6.使用虛函數提高了程序的可擴展性。

給人筆記,僅供參考,歡迎指教!

未經允許,請勿轉載!

第十二章 多態性與抽象類