1、C++物件記憶體包含兩部分:欄位和虛方法表指標vptr,vptr指向vtbl,vtbl包含型別資訊和一組虛方法,虛方法按照類的定義順序進行排列。
2、成員方法並不佔用物件記憶體,無論是static方法,還是non-static方法。
3、那麼,思考一下,物件是如何繫結到成員方法的呢?
對於程式設計師,方法分為成員方法和普通方法。對於編譯器,沒有成員方法,因為成員方法,會轉化為普通方法。比如person.SetName(),對於編譯器來說,會轉化為SetName(person),student.SetName()轉化為SetName(student)。
3、那麼問題來了,這種方式,顯然無法滿足,執行時多型。考慮,person是指向Student 的引用,person.SetName(),轉化為SetName(person),編譯器確定方法的時候,根據形參的表面型別,呼叫SetName(person),而實際上應該呼叫SetName(student)。因此,對於執行時多型,要使用特別的方法。也就是上面的vptr。
4、vptr的實現原理是:對於vtbl中的一組虛方法,在物件的構造方法中,已經根據物件的真實型別,偷樑換柱地設定了自己的方法,不再是父類的方法。