C++多態的原理

多態的原理

例1:定義一個Shape類,其中有一個虛函數和數據成員,然後定義一個Circle類,只有構造函數和數據成員,並且公有的繼承Shape類,所以Circle類使用的也是Shape類的虛函數來計算面積,此時的虛函數如何來實現呢?

 

當我們實例化一個Shape對象的時候,這個Shape對象中除了有數據成員,還有虛函數表指針,虛函數表指針是指向虛函數表的,父類的虛函數表只有一個,通過父類實例化的所有對象的虛函數表指針都和父類的值一樣,以確保他們都是指向自己的虛函數表。虛函數表中都定義了虛函數的函數指針,指向虛函數。調用過程:虛函數表指針-->虛函數表-->函數指針-->函數

當我們實例化一個Circle對象的時候,由於它繼承了Shape的虛函數,所以也會產生一個自己的虛函數表

 

如果我們在Circle中定義了相同的calcArea()函數,Shape中的情況不會變,Circle的虛函數表中的calcArea()函數的函數指針(calcArea——ptr)會變成自己定義的函數地址

 調用過程:虛函數表指針-->虛函數表-->函數指針-->函數

因此,如果我們用Shape的指針指向Circle的對象,他就會找到Circle的虛函數表指針,從而找到Circle的虛函數表,在找到Circle的函數進行執行。這就是多態的原理。

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