每個包含了虛函式的類都包含乙個虛表。
我們知道,當乙個類(a)繼承另乙個類(b)時,類a會繼承類b的函式的呼叫權。所以如果乙個基類包含了虛函式,那麼其繼承類也可呼叫這些虛函式,換句話說,乙個類繼承了包含虛函式的基類,那麼這個類也擁有自己的虛表。
個人理解:用父類指標指向子類物件時,如果基類中有虛函式,那麼,虛函式的呼叫是利用編譯器自帶的虛函式表來呼叫,如果子類中有重寫該函式,那麼虛函式表中的位址就會被替換,所以結果就是如果子類有實現就呼叫子類的函式,如果子類中沒有重寫,那麼,虛函式表中的該位置就是父類中虛函式的位址,所以呼叫的只能是父類的函式;
其中,虛函式表中的內容是所有虛函式的位址,排序順序是父類的在前,子類的緊跟在父類的後面,子類有重寫的虛函式,會覆蓋父類中該函式的位址,而不是新加;
參考位址
虛函式表指標,虛函式表
對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...
虛函式(虛函式表vtable 的實現
乙個動態的鏈結究竟怎樣實現的呢?首先,如果乙個基類中有虛函式,則編譯器自動生成乙個指向虛函式位址的表。有 幾個虛函式,對應的虛函式表 vftable 的長就是幾。然後,在基類中生成乙個指向虛函式表的指標。對應的每個虛函式由編譯器將其對映為虛函式表指標 vfptr 加上乙個數字 這個數 字就是真正的虛...
C 虛函式實現 虛函式表 虛表指標
內聯函式 編譯時展開的,虛函式是為了實現多型,是動態行為,兩者是矛盾的。內聯函式展開就不存在了,也就不存在函式位址了,無法呼叫。但是,由於inline只是向編譯器建議,所以編譯器不會讓inline和virtual同時起作用,所以也不會報錯。建構函式 虛函式使用虛指標呼叫函式,呼叫建構函式之前沒有構造...