C/C++編程筆記:C++入門知識丨多態(tài)性和虛函數(shù)
本篇要學(xué)習(xí)的內(nèi)容和知識結(jié)構(gòu)概覽

多態(tài)性
編譯時的多態(tài)性稱為靜態(tài)聯(lián)編. 當(dāng)調(diào)用重載函數(shù)時, 在編譯期就確定下來調(diào)用哪個函數(shù).
運(yùn)行時的多態(tài)性稱為動態(tài)聯(lián)編. 在運(yùn)行時才能確定調(diào)用哪個函數(shù), 由虛函數(shù)來支持.
靜態(tài)聯(lián)編中的賦值兼容性及名字支配規(guī)律
派生一個類的原因并非總是為了添加新的成員或成員函數(shù), 有時是為了重新定義基類的成員函數(shù)。


在派生類有同名函數(shù)的情況下
Point * pPoint; // 聲明的基類指針只能指向基類
Circle * pCircle // 聲明的派生類指針只能指向派生類
如果派生類沒有基類的同名函數(shù), 派生類的指針才根據(jù)繼承原則調(diào)用基類的函數(shù)
虛函數(shù)
一旦定義了虛函數(shù), 該基類的派生類中的同名函數(shù)也自動成為虛函數(shù).
虛函數(shù)的定義
用關(guān)鍵字virtual來聲明一個虛函數(shù), 虛函數(shù)只能是類中的一個成員函數(shù), 不能是靜態(tài)成員.
像這樣:

虛函數(shù)實現(xiàn)多態(tài)性的條件
關(guān)鍵字virtual告訴編譯器調(diào)用虛函數(shù)進(jìn)行動態(tài)聯(lián)編.
使用虛函數(shù)不一定產(chǎn)生多態(tài)性, 也不一定使用動態(tài)聯(lián)編.
在調(diào)用中對虛函數(shù)使用成員名限定, 可以強(qiáng)制編譯器對該函數(shù)使用靜態(tài)聯(lián)編.
產(chǎn)生運(yùn)行多態(tài)性, 也就是動態(tài)聯(lián)編有3個前提
(1)類之間的繼承關(guān)系滿足賦值兼容性規(guī)則
(2)改寫了同名虛函數(shù)
(3)根據(jù)賦值兼容性規(guī)則使用指針(或引用)
像這樣:


純虛函數(shù)與抽象類
在基類中不給虛函數(shù)一個有意義的定義, 可以說明為純虛函數(shù), 將定義留給派生類去做
像這樣:

抽象類:包含有純虛函數(shù)的類稱為抽象類. 一個抽象類至少有一個純虛函數(shù), 一個抽象類只能作為基類來派生新類, 不能說明抽象類的對象.

注意
空虛函數(shù)定義 virtual void area() {}
純虛函數(shù)定義 virtual void area()? = 0;
純虛函數(shù)的派生類仍是抽象類. 如果派生類中給出了基類所有純虛函數(shù)的實現(xiàn), 則該派生類不再是抽象類
類族
如果通過同一個基類派生一系列的類, 則將這些類總稱為類族.
像這樣:


多重繼承與虛函數(shù)
多重繼承可以被視為多個單一繼承的組合。

總結(jié)
C++有兩種多態(tài)性, 一種是編譯時多態(tài)性, 也叫靜態(tài)聯(lián)編; 另一種是運(yùn)行時多態(tài)性, 也叫動態(tài)聯(lián)編. 這大大提高了我們解決問題的豐富性. 可能也是C++長久不衰的魅力所在吧! 我會繼續(xù)深入學(xué)習(xí)C++, 繼續(xù)挖掘語言的本質(zhì)!
自學(xué)C/C++編程難度很大,不妨和一些志同道合的小伙伴一起學(xué)習(xí)成長!

學(xué)習(xí)C/C++編程知識,提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~