當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > c多態(tài)的作用,讓你快速學(xué)會(huì)c多態(tài)
作用:
什么是多態(tài):調(diào)用同一個(gè)函數(shù)(接口)表現(xiàn)出不同的結(jié)果
多態(tài)按字面的意思就是多種形態(tài)。當(dāng)類(lèi)之間存在層次結(jié)構(gòu),并且類(lèi)之間是通過(guò)繼承關(guān)聯(lián)時(shí),就會(huì)用到多態(tài)。
C++ 多態(tài)意味著調(diào)用成員函數(shù)時(shí),會(huì)根據(jù)調(diào)用函數(shù)的對(duì)象的類(lèi)型來(lái)執(zhí)行不同的函數(shù)。
函數(shù)重寫(xiě)(函數(shù)覆蓋):
1. 函數(shù)名相同
2. 入?yún)⒁粯,返回值相?/p>
3. 作用域不一樣,一個(gè)位于基類(lèi),一個(gè)位于派生類(lèi)。
4. 基類(lèi)的函數(shù)必須加virutal,派生類(lèi)的同名函數(shù)可以加可不加。
5. 訪問(wèn)限定符可以不一樣
虛函數(shù):
虛函數(shù) 是在基類(lèi)中使用關(guān)鍵字 virtual 聲明的函數(shù)。在派生類(lèi)中重新定義基類(lèi)中定義的虛函數(shù)時(shí),會(huì)告訴編譯器不要靜態(tài)鏈接到該函數(shù)。
我們想要的是在程序中任意點(diǎn)可以根據(jù)所調(diào)用的對(duì)象類(lèi)型來(lái)選擇調(diào)用的函數(shù),這種操作被稱(chēng)為動(dòng)態(tài)鏈接,或后期綁定。
純虛函數(shù):
您可能想要在基類(lèi)中定義虛函數(shù),以便在派生類(lèi)中重新定義該函數(shù)更好地適用于對(duì)象,但是您在基類(lèi)中又不能對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn),這個(gè)時(shí)候就會(huì)用到純虛函數(shù)。
怎么樣實(shí)現(xiàn)多態(tài)?
1. 派生類(lèi)重寫(xiě)基類(lèi)的虛函數(shù)
2. 通過(guò)基類(lèi)的指針指向派生類(lèi)對(duì)象,通過(guò)基類(lèi)指針調(diào)用虛函數(shù),可以保證接口高度統(tǒng)一
賦值兼容規(guī)則
基類(lèi)的指針可以指向派生類(lèi)對(duì)象,而派生類(lèi)指針不能指向基類(lèi)的對(duì)
象
純虛函數(shù):虛函數(shù) =0;
包含純虛函數(shù)的類(lèi)叫抽象類(lèi),抽象類(lèi)無(wú)法創(chuàng)建對(duì)象。函數(shù)重載、函數(shù)重寫(xiě)(覆蓋)、函數(shù)隱藏的區(qū)別?
1、成員函數(shù)覆蓋(override,也稱(chēng)重寫(xiě))
是指派生類(lèi)重新定義基類(lèi)的虛函數(shù),特征如下:
A、不同的作用域(分別位于派生類(lèi)與基類(lèi))
B、函數(shù)名字相同
C、參數(shù)相同
D、基類(lèi)函數(shù)必須有virtual關(guān)鍵字,不能有static
E、返回值相同
F、重寫(xiě)函數(shù)的權(quán)限訪問(wèn)限定符可以不同
2、函數(shù)重載(overload)
是指函數(shù)名相同,參數(shù)不同(數(shù)量、類(lèi)型、次序),特征如下:
A、相同的范圍(在同一個(gè)作用域中)
B、函數(shù)名字相同
C、參數(shù)不同
D、virtual 關(guān)鍵字可有可無(wú)
E、返回值可以不同靜態(tài)聯(lián)編(靜態(tài)鏈接)
是指在編譯階段就將函數(shù)實(shí)現(xiàn)和函數(shù)調(diào)用關(guān)聯(lián)起來(lái),因此靜態(tài)聯(lián)編也叫早綁定,函數(shù)重載是早綁定
動(dòng)態(tài)聯(lián)編(動(dòng)態(tài)鏈接)
是指在程序執(zhí)行的時(shí)候才將函數(shù)實(shí)現(xiàn)和函數(shù)調(diào)用關(guān)聯(lián),因此也叫運(yùn)行時(shí)綁定或者晚綁定。
C++中一般情況下聯(lián)編也是靜態(tài)聯(lián)編,但是一旦涉及到多態(tài)和虛擬函數(shù)就必須要使用動(dòng)態(tài)聯(lián)編了
3、成員函數(shù)隱藏(也稱(chēng)重定義,盡量不去寫(xiě))
A、不在同一個(gè)作用域(分別位于派生類(lèi)與基類(lèi))
B、函數(shù)名字相同
C、返回值可以不同
D、參數(shù)不同。此時(shí),不論有無(wú) virtual 關(guān)鍵字,基類(lèi)的函數(shù)將被隱藏(注意與重載的區(qū)別)
E、參數(shù)相同,但是基類(lèi)函數(shù)沒(méi)有 virtual關(guān)鍵字。此時(shí),基類(lèi)的函數(shù)被隱藏(注意與覆蓋的區(qū)別)
多態(tài)的原理:虛函數(shù)表
通過(guò)基類(lèi)的指針或引用調(diào)用虛函數(shù),到底調(diào)用是基類(lèi)的虛函數(shù)還是派生類(lèi)重寫(xiě)后的虛函數(shù),
看的是對(duì)象,而不是指針的數(shù)據(jù)類(lèi)型。
原因:虛函數(shù)的調(diào)用會(huì)查虛函數(shù)表,每個(gè)對(duì)象的虛函數(shù)表不一樣,調(diào)用的虛函數(shù)就不一樣。
虛析構(gòu)
析構(gòu)函數(shù)前為什么加virtual關(guān)鍵字?
只有虛函數(shù)的調(diào)用,是看對(duì)象不同查對(duì)象的虛函數(shù)表,其他看指針或引用的數(shù)據(jù)類(lèi)型。
如果不在析構(gòu)函數(shù)前加virtual ,在某些情況下會(huì)產(chǎn)生內(nèi)存泄漏。推薦在析構(gòu)函數(shù)前加virtual
構(gòu)造函數(shù)前為什么加explicit關(guān)鍵字?
給單參數(shù)的構(gòu)造函數(shù)前使用explicit關(guān)鍵字,阻止可能產(chǎn)生的隱式轉(zhuǎn)換:由成員變量類(lèi)型轉(zhuǎn)換為類(lèi)類(lèi)型。