虛函數實現機制

虛函數實現機制:

1、當類中存在虛函數里.則編譯器會在編譯期自動的給該類生成一個函數表,并在所有該類的對像中放入一個隱式變量vptr,該變量是一個指針變量,它的值指向那個類中的由編譯器生成的虛函數表.

2、每個類自己的虛函數入口都在這張表中維護,調用方法的時候會隱式的傳入一個this指針,然后系統會根據this指針找到對應的vptr,進而找到對應的虛函數表,找到真正方法的地址,然后才去調用這個方法,這可以叫動態綁定。

3、虛函數表存放重寫的虛函數,當基類的指針指向派生類的對象時,調用虛函數時都會根據vptr來選擇虛函數,而基類的虛函數在派生類里已經被改寫或者說已經不存在了,所以也就只能調用派生類的虛函數版本了.


當調用pBase->show();時,執行的步驟:

1,? 判斷Base類中show是否為虛函數。

2,? 若不是虛函數則找到pBase所指向的對象所屬類Base。執行Base::show()。若是虛函數則執行步驟3.

3,? 訪問pBase所指對象的虛函數表指針得到pBase所指對象所在類的虛函數表。

4,? 查找Base中show()在聲明時的位序為x,到步驟3得到的虛函數表中找到位序x,從而得到要執行的show的函數地址。

5,? 根據函數地址和Base中聲明的show的函數類型(形參和返回值)訪問地址所指向的函數。


從虛函數的實現機制可以看到要想在子類中實現多態需要滿足三個重要的條件。

(1)在基類中函數聲明為虛函數。

(2)在子類中,對基類的虛函數進行了重寫。

(3)基類的指針指向了子類的對象。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一個博客,這個博客記錄了他讀這本書的筆記,總結得不錯。《深度探索C++對象模型》筆記匯總 1. C++對象模型與內...
    Mr希靈閱讀 5,638評論 0 13
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,534評論 1 51
  • C++ 面向對象編程 博客園地址:http://www.cnblogs.com/xiongxuanwen/p/42...
    先之閱讀 687評論 0 1
  • C++虛函數 C++虛函數是多態性實現的重要方式,當某個虛函數通過指針或者引用調用時,編譯器產生的代碼直到運行時才...
    小白將閱讀 1,755評論 4 19
  • 今天去找領導簽字,各種不順,以前的我可能會各種不舒服、糾結,怕自己給領導留下壞印象,對我發展不順利;可今天的我竟然...
    北極熊和小兔子閱讀 490評論 0 48