子类重写父类虚函数_C/C++编程笔记:关于C++的虚函数和多态,你真的了解吗?...
前言
本章節(jié)主要針對(duì)于C++中的虛函數(shù)和多態(tài)做一個(gè)詳細(xì)介紹。
虛函數(shù)
虛函數(shù)的長(zhǎng)相其實(shí)很簡(jiǎn)單,在C++類型用virtual修飾的函數(shù)就是虛函數(shù),如下代碼:
虛函數(shù)對(duì)于本類的影響:存在虛函數(shù)類的內(nèi)存會(huì)多四個(gè)字節(jié),如下測(cè)試代碼:
不過無論有多少個(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)建對(duì)象,但是可以創(chuàng)建對(duì)象指針,如下代碼:
抽象類一般充當(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ù)的對(duì)象的類型來執(zhí)行不同的函數(shù)。其實(shí)對(duì)于多態(tài)的基本概念不需要背下來,只要你知道那個(gè)對(duì)象或者指針調(diào)用哪個(gè)成員基本上就行。
如一下代碼:
1.正常情況下
就是本類對(duì)象初始化本類指針,本類對(duì)象或者之指針調(diào)用本類的成員,無論是父類還是子類就是就近原則。
2.非正常情況下
父類對(duì)象初始化子類對(duì)象,一般是不允許這樣的操作的,這里不做概述,子類對(duì)象初始化父類指針,要看父類是否存在virtual,如果不存在,以指針類型為主,如果存在virtual就以對(duì)象為主。如一下測(cè)試代碼:
關(guān)于多態(tài)的實(shí)現(xiàn),不妨自行看看虛函數(shù)表的內(nèi)容,我相信有很多博客文章都有講解,這里不做詳細(xì)概述。
虛析構(gòu)函數(shù)
虛析構(gòu)函數(shù)也就是使用virtual修飾的虛函數(shù),為了能夠防止子類對(duì)象初始化父類指針過程中的所引發(fā)的析構(gòu)問題,我們常常會(huì)把父類的析構(gòu)函數(shù)寫成虛析構(gòu)函數(shù)。如下測(cè)試代碼:
如果你將父類的析構(gòu)函數(shù)改為虛析構(gòu)函數(shù),子類和父類的析構(gòu)函數(shù)將都可以被調(diào)用有興趣的可以去試試哦。
希望對(duì)大家有幫助!
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!
C語言C++編程學(xué)習(xí):
點(diǎn)擊領(lǐng)取C/C++編程學(xué)習(xí)資料?jq.qq.com分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
編程學(xué)習(xí)軟件分享:
編程學(xué)習(xí)視頻分享:
總結(jié)
以上是生活随笔為你收集整理的子类重写父类虚函数_C/C++编程笔记:关于C++的虚函数和多态,你真的了解吗?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python异常处理机制的好处_浅谈Py
- 下一篇: float类型转integer_Java