通俗易懂化難啃的虛函數

深入淺出虛函數

今天寫了難啃的知識點,我把它剝開剖析了一下,哎呦還不錯哦,死結打開了。

1 虛函數是什麼呢?

說白了就是前面加了virtual的函數。大多都在父類(叫基類也可)裏面聲明。它存在的意義就是給繼承我的子類們留下無限的想象力來完善或完全開發這個功能。
上面這個“ 完善呢”是針對純虛的函數,也就是非虛函數,在父類裏面加了一點點實現,剩下的大部分等着“兒子或孫子”去實現(嘿嘿)。
那我上面說的這個“完全開發呢”就是針對這個純虛函數了,純虛函數裏面是一丁點實現也不寫啊,直接就聲明爲0。其實呢純虛函數就是給以後設計衆多子類或孫子類的程序員們一個信號:“這個功能要去做哦,但目前我不知道怎麼做,但是我就是預測以後會有漏洞和隱患,子孫們要好好思考去做這個功能哦”。

2 再說說我一直不太好理解的這個 A *a = new B();a->run()到底調用的哪一個run()呢?

我們需要的知識點是:
創建一個父類對象,編譯器就給把虛表指針指向了父類虛函數,同樣的,子類對象創建時就把虛表指針指向了子類虛函數(只不過這個虛表指針來自於父類)(還要記得編譯器是再對象構造時候就已經把虛表指針指向了各自的虛函數)。

梳理一下A *a = new B():
new B(),子類對象創建,開闢一塊內存,把地址本該賦給子類B類對象指針現在賦給了父類a指針,轉換了類型,a->run()直接跳到了B內存裏的第一個位置“B類的虛表指針”去運行B類的虛函數run()。

再進一步消化一下啦:A *a = new B();a->run();
 第一步: 把B類對象的內存地址賦給a。
 第二步: 程序直接跳到B對象內存的第一個位置(虛表指針),跟着虛表指針來到B類的虛函數運行run()函數,真正的實現了多態。

我的其他文章在這裏哦 程序員面試必備寶典-《劍指offer》“找出數組中重複數字 ” 完整代碼+思路總結(c++實現)

轉載地址:https://editor.csdn.net/md/?articleId=105110060

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章