C++多態的實現和原理


一、多態的實現

1. 在編譯期間實現多態

多態是指在不同的條件下表現出不同的狀態,C++中通過重載函數的方法,可以在編譯期間實現多態。(靜態多態)

在編譯期間,編譯器會根據參數列表的不同尋找合適的函數。

2. 使用虛函數實現多態

通過繼承重寫基類的虛函數實現多態,運行時在虛函數表中尋找調用函數的地址。(動態多態)

在基類的函數前加上virtual關鍵字,在派生類中重寫該函數,運行時會根據對象的實際類型來調用相應的函數。如果對象是子類,就調用子類的函數;如果對象類型是父類,就調用父類的函數,此為多態的表現。

 

二、多態的實現原理

1.重要名詞

用virtual關鍵字申明的函數叫做虛函數,虛函數肯定是類的成員;

存在虛函數的類都有一個以為的虛函數表叫做虛表。當類中聲明虛函數時,編譯器會在類中生成一個虛函數表;

類的對象有一個指向虛表開始的虛指針。虛表時和類對應的,虛表指針時和對象對應的。

虛函數表是一個存儲類成員函數指針的數據結構;

虛函數表是由編譯器自動生成與維護的;

virtual成員函數會被編譯器放入虛函數表中;

當存在虛函數時,每個對象都有一個指向虛函數的指針

虛函數指針一般作為類對象的第一個成員

2. 虛函數表

虛函數表時通過一塊連續的內存來存儲虛函數的地址。這張表解決了繼承、虛函數(重寫)的問題。在有虛函數的類的對象中都存在一張虛函數表,它就像一張地圖,指向了實際調用的虛函數。

 

 

 

 

 

 

兩篇很好的博文

https://www.jianshu.com/p/c8e74ef95091

https://www.jianshu.com/p/31373b52902d


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM