第十二章 多態性與抽象類
第十二章 多態與虛函數
一、多態的概念
向不同的對象發送同一個消息,不同的對象在接收時會產生不同的行為
具有不同功能的函數名可以用同一個函數名,以實現用一個函數名調用不同內容的函數
*靜態多態和動態多態(編譯時的多態性和運行時的多態性)
靜態多態的特點:調用速率快、效率高,但缺少靈活性,在程序運行前就已經決定了執行的函數和方法
動態多態的特點:不在編譯時確定調用的是哪個函數,只有在程序運行時才動態確定操作所針對的對象。動態多態是通過虛函數實現的。
二、利用虛函數實現動態多態性
*虛函數的作用
函數重載處理的是同一層次上的同名函數問題,而虛函數處理的是不同派生層次的同名函數問題,前者是橫向重載
*靜態關聯與動態關聯(早期關聯與滯後關聯)
*虛函數聲明
1.只能用virtual聲明類的成員函數,把它作為虛函數
2.一個成員函數配聲明為虛函數後,在同一類族就不能再定義一個非virtual 且函數首部相同的函數
3.考慮事項:
(1)如果成員函數在類的繼承後出現功能的更改一般聲明為虛函數
(2)如果通過基類指針或者引用去訪問,則應當聲明為虛函數
(3)有時會定義空函數體的虛函數,留給派生類添加
*虛析構函數
當基類有非虛析構函數時,只執行基類的析構函數,不執行派生類的析構函數。如果希望能執行派生類的析構函數,可以講基類的析構函數聲明為虛構函數,此時,該基類所有的派生類的析構函數都自動成為虛函數,即使派生類與基類的析構函數名不同。
註:構造函數不能聲明為虛函數
三、純虛函數與抽象類
1.純虛函數概念
對於基類的虛函數不作任何處理的情況的一種簡化形式
virtual 函數類型 函數名(參數表)= 0 ;
註意:純虛函數沒有函數體;最後的=0不表示函數返回值為0,只起形式作用;
2.抽象類
含有純虛函數的類就是抽象類
只用來派生,不用來生成定義對象
四、結論
1.某基類包含一個或多個純虛函數,就是抽象類
2.抽象類一般不是現實存在的對象的抽象
3.在類的層次結構中,頂層或最上面幾層都可以是抽象類
4.抽象基類是本類族的共用接口,或者說是從同一基類派生出的多個類有同一接口,因此,能響應同一形式的消息。
5.如果基類聲明了虛函數,則在派生類中出現首部相同的函數均為虛函數(默認)
6.使用虛函數提高了程序的可擴展性。
給人筆記,僅供參考,歡迎指教!
未經允許,請勿轉載!
第十二章 多態性與抽象類