當(dāng)前位置:首頁 > 嵌入式培訓(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)類之間存在層次結(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ù)重寫(函數(shù)覆蓋):
1. 函數(shù)名相同
2. 入?yún)⒁粯,返回值相?/p>
3. 作用域不一樣,一個(gè)位于基類,一個(gè)位于派生類。
4. 基類的函數(shù)必須加virutal,派生類的同名函數(shù)可以加可不加。
5. 訪問限定符可以不一樣
虛函數(shù):
虛函數(shù) 是在基類中使用關(guān)鍵字 virtual 聲明的函數(shù)。在派生類中重新定義基類中定義的虛函數(shù)時(shí),會(huì)告訴編譯器不要靜態(tài)鏈接到該函數(shù)。
我們想要的是在程序中任意點(diǎn)可以根據(jù)所調(diào)用的對(duì)象類型來選擇調(diào)用的函數(shù),這種操作被稱為動(dòng)態(tài)鏈接,或后期綁定。
純虛函數(shù):
您可能想要在基類中定義虛函數(shù),以便在派生類中重新定義該函數(shù)更好地適用于對(duì)象,但是您在基類中又不能對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn),這個(gè)時(shí)候就會(huì)用到純虛函數(shù)。
怎么樣實(shí)現(xiàn)多態(tài)?
1. 派生類重寫基類的虛函數(shù)
2. 通過基類的指針指向派生類對(duì)象,通過基類指針調(diào)用虛函數(shù),可以保證接口高度統(tǒng)一
賦值兼容規(guī)則
基類的指針可以指向派生類對(duì)象,而派生類指針不能指向基類的對(duì)
象
純虛函數(shù):虛函數(shù) =0;
包含純虛函數(shù)的類叫抽象類,抽象類無法創(chuàng)建對(duì)象。函數(shù)重載、函數(shù)重寫(覆蓋)、函數(shù)隱藏的區(qū)別?
1、成員函數(shù)覆蓋(override,也稱重寫)
是指派生類重新定義基類的虛函數(shù),特征如下:
A、不同的作用域(分別位于派生類與基類)
B、函數(shù)名字相同
C、參數(shù)相同
D、基類函數(shù)必須有virtual關(guān)鍵字,不能有static
E、返回值相同
F、重寫函數(shù)的權(quán)限訪問限定符可以不同
2、函數(shù)重載(overload)
是指函數(shù)名相同,參數(shù)不同(數(shù)量、類型、次序),特征如下:
A、相同的范圍(在同一個(gè)作用域中)
B、函數(shù)名字相同
C、參數(shù)不同
D、virtual 關(guān)鍵字可有可無
E、返回值可以不同靜態(tài)聯(lián)編(靜態(tài)鏈接)
是指在編譯階段就將函數(shù)實(shí)現(xiàn)和函數(shù)調(diào)用關(guān)聯(lián)起來,因此靜態(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ù)隱藏(也稱重定義,盡量不去寫)
A、不在同一個(gè)作用域(分別位于派生類與基類)
B、函數(shù)名字相同
C、返回值可以不同
D、參數(shù)不同。此時(shí),不論有無 virtual 關(guān)鍵字,基類的函數(shù)將被隱藏(注意與重載的區(qū)別)
E、參數(shù)相同,但是基類函數(shù)沒有 virtual關(guān)鍵字。此時(shí),基類的函數(shù)被隱藏(注意與覆蓋的區(qū)別)
多態(tài)的原理:虛函數(shù)表
通過基類的指針或引用調(diào)用虛函數(shù),到底調(diào)用是基類的虛函數(shù)還是派生類重寫后的虛函數(shù),
看的是對(duì)象,而不是指針的數(shù)據(jù)類型。
原因:虛函數(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ù)類型。
如果不在析構(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)換:由成員變量類型轉(zhuǎn)換為類類型。