如果父類中存在虛函式,那麼父類,以及由其直接和間接派生的子類都會存在虛函式表。每個類的虛函式表中儲存的是這個類繼承的虛函式以及自己實現的虛函式的位址。
比如說, base 類 中定義了虛函式 virtual f(){};
而由base類派生的derived 類 過載了這個虛函式 virtual f(){};
那麼,base 類的虛函式表中存放的是 base 類裡定義的 f() 的位址
derived 類的虛函式表中存放的是 derived 類中定義的 f() 的位址
虛函式表中虛函式的順序是這樣的:
1、先列出父類的虛函式,再列出子類的虛函式
2、同乙個類中的虛函式在虛函式表中的次序由宣告次序決定
3、倘若子類過載了父類的虛函式(當然,若不過載的話,虛函式的存在也將失去意義),那麼子類的虛函式表中,本該由父類的虛函式佔據的位置由過載的子類虛函式替代
我覺得還有一點有必要寫一下
我們都知道,我們永遠不可能用父類的指標去呼叫子類的成員函式。
如果成員函式不是過載的虛函式,那麼這點是很顯然的
而如果這個成員函式是過載的虛函式呢?你能否給出乙個完美的解釋?
這就是說,父類的虛函式表中不存在子類過載的虛函式的位址!
因此,用父類的指標想去呼叫子類虛函式,,,還是洗洗睡吧。。。
最後有一點想說的是
不管是父類還是子類,虛函式表都存在他們的記憶體結構的頭部(很早之前是在尾部的。。。)
但要注意的是,在記憶體結構的頭部並不是真的存了一連串的虛函式位址
而實際上是儲存了乙個指標 vptr
就是這個vptr 指向了類的虛函式表 vtbl
可這個vtbl到底實際被存在什麼地方
虛函式表指標,虛函式表
對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...
虛函式表和虛函式表的指標
有虛函式的類都有乙個虛函式表,它是實現多型的關鍵。虛函式表可以繼承,如果子類沒有重寫虛函式,那麼子類虛函式表中仍然會有該函式的位址,只不過這個位址指向的是基類的函式實現。如果子類重寫了相應的虛函式,那麼虛函式表中的位址就會改變,指向自身的函式實現。如果派生類中有自己的虛函式,那麼虛函式表中會新增該項...
關於虛函式表的個人總結
原文 關於虛函式表的個人總結 1.虛函式表的建立 乙個類存在虛函式的時候,編譯器會為這個類建立乙個虛函式表,這個表由這個類的所有物件共同所有。在建立這個類的類物件的時候將這個物件的前4個位元組作為這項這個虛函式表的指標。即類物件的首位址中的內容存放的是虛函式表的位址。虛函式表的首位址裡面存放的是第乙...