更新時間:2020-11-20 來源:黑馬程序員 瀏覽量:
C++的多態(tài)分為靜態(tài)多態(tài)(編譯時多態(tài))和動態(tài)多態(tài)(運行時多態(tài))兩大類。靜態(tài)多態(tài)通過重載、模板來實現(xiàn);動態(tài)多態(tài)就是通過本文的主角虛函數(shù)來體現(xiàn)的。
虛函數(shù)實現(xiàn)原理:包括虛函數(shù)表、虛函數(shù)指針等。
虛函數(shù)的作用說白了就是:當(dāng)調(diào)用一個虛函數(shù)時,被執(zhí)行的代碼必須和調(diào)用函數(shù)的對象的動態(tài)類型相一致。編譯器需要做的就是如何高效的實現(xiàn)提供這種特性。不同編譯器實現(xiàn)細節(jié)也不相同。大多數(shù)編譯器通過vtbl(virtual table)和vptr(virtual table pointer)來實現(xiàn)的。 當(dāng)一個類聲明了虛函數(shù)或者繼承了虛函數(shù),這個類就會有自己的vtbl。vtbl實際上就是一個函數(shù)指針數(shù)組,有的編譯器用的是鏈表,不過方法都是差不多。vtbl數(shù)組中的每一個元素對應(yīng)一個函數(shù)指針指向該類的一個虛函數(shù),同時該類的每一個對象都會包含一個vptr,vptr指向該vtbl的地址。
每個聲明了虛函數(shù)或者繼承了虛函數(shù)的類,都會有一個自己的vtbl。
同時該類的每個對象都會包含一個vptr去指向該vtbl。
虛函數(shù)按照其聲明順序放于vtbl表中, vtbl數(shù)組中的每一個元素對應(yīng)一個函數(shù)指針指向該類的虛函數(shù)。
如果子類覆蓋了父類的虛函數(shù),將被放到了虛表中原來父類虛函數(shù)的位置。
在多繼承的情況下,每個父類都有自己的虛表。子類的成員函數(shù)被放到了第一個父類的表中。
猜你喜歡:
【AI設(shè)計】北京143期畢業(yè)僅36天,全員拿下高薪offer!黑馬AI設(shè)計連續(xù)6期100%高薪就業(yè)
2025-09-19【跨境電商運營】深圳跨境電商運營畢業(yè)22個工作日,就業(yè)率91%+,最高薪資達13500元
2025-09-19【AI運維】鄭州運維1期就業(yè)班,畢業(yè)14個工作日,班級93%同學(xué)已拿到Offer, 一線均薪資 1W+
2025-09-19【AI鴻蒙開發(fā)】上海校區(qū)AI鴻蒙開發(fā)4期5期,距離畢業(yè)21天,就業(yè)率91%,平均薪資14046元
2025-09-19【AI大模型開發(fā)-Python】畢業(yè)33個工作日,就業(yè)率已達到94.55%,班均薪資20763元
2025-09-19【AI智能應(yīng)用開發(fā)-Java】畢業(yè)當(dāng)天offer率91%,薪資1W+占比54.2%,班級均薪12k+
2025-09-19