C/C++編程筆記:關(guān)于C++的虛函數(shù)和多態(tài),你必須了解這三點(diǎn)!
前言
本章節(jié)主要針對于C++中的虛函數(shù)和多態(tài)做一個(gè)詳細(xì)介紹。

虛函數(shù)
虛函數(shù)的長相其實(shí)很簡單,在C++類型用virtual修飾的函數(shù)就是虛函數(shù),如下代碼:

虛函數(shù)對于本類的影響:存在虛函數(shù)類的內(nèi)存會(huì)多四個(gè)字節(jié),如下測試代碼:

不過無論有多少個(gè)虛函數(shù),內(nèi)存只會(huì)多4個(gè)字節(jié),因?yàn)樗刑摵瘮?shù)都是用一個(gè)指針去存儲(chǔ)的,即就是所謂的虛函數(shù)指針,虛函數(shù)指針(virtual function pointer)從本質(zhì)上來說就只是一個(gè)指向函數(shù)的指針,與普通的指針并無區(qū)別。它指向用戶所定義的虛函數(shù),具體是在子類里的實(shí)現(xiàn),當(dāng)子類調(diào)用虛函數(shù)的時(shí)候,實(shí)際上是通過調(diào)用該虛函數(shù)指針從而找到接口。
抽象類
具有純虛函數(shù)的類我們稱之為抽象類,而純虛函數(shù)就是沒有函數(shù)體的函數(shù),它也是一個(gè)特殊的虛函數(shù),形態(tài)如下: virtual 函數(shù)返回值類型 函數(shù)名(參數(shù))=0,抽象類不能創(chuàng)建對象,但是可以創(chuàng)建對象指針,如下代碼:
抽象類一般充當(dāng)ADT過程,也就是抽象數(shù)據(jù)類型使用,以及在設(shè)計(jì)模式中充當(dāng)中間交互層。
虛函數(shù)和多態(tài)
多態(tài)按字面的意思就是多種形態(tài)。當(dāng)類之間存在層次結(jié)構(gòu),并且類之間是通過繼承關(guān)聯(lián)時(shí),就會(huì)用到多態(tài)。C++ 多態(tài)意味著調(diào)用成員函數(shù)時(shí),會(huì)根據(jù)調(diào)用函數(shù)的對象的類型來執(zhí)行不同的函數(shù)。其實(shí)對于多態(tài)的基本概念不需要背下來,只要你知道那個(gè)對象或者指針調(diào)用哪個(gè)成員基本上就行。
如一下代碼:

1.正常情況下
就是本類對象初始化本類指針,本類對象或者之指針調(diào)用本類的成員,無論是父類還是子類就是就近原則。

2.非正常情況下
父類對象初始化子類對象,一般是不允許這樣的操作的,這里不做概述,子類對象初始化父類指針,要看父類是否存在virtual,如果不存在,以指針類型為主,如果存在virtual就以對象為主。如一下測試代碼:

關(guān)于多態(tài)的實(shí)現(xiàn),不妨自行看看虛函數(shù)表的內(nèi)容,我相信有很多博客文章都有講解,這里不做詳細(xì)概述。
虛析構(gòu)函數(shù)
虛析構(gòu)函數(shù)也就是使用virtual修飾的虛函數(shù),為了能夠防止子類對象初始化父類指針過程中的所引發(fā)的析構(gòu)問題,我們常常會(huì)把父類的析構(gòu)函數(shù)寫成虛析構(gòu)函數(shù)。如下測試代碼:

如果你將父類的析構(gòu)函數(shù)改為虛析構(gòu)函數(shù),子類和父類的析構(gòu)函數(shù)將都可以被調(diào)用有興趣的可以去試試哦。
希望對大家有幫助!
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!

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