虛函數實現機制:
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)基類的指針指向了子類的對象。