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

