c++中虛函式是通過一張虛函式表來實現的,簡稱v-table,在c++的標準規格說明書中說到,編譯器必須要保證虛函式表的指標存在於物件例項中最前面的位置(這是為了保證正確取到虛函式的偏移量)。
一般繼承且無虛函式覆蓋
上面圖中的這個點是虛函式的結束標誌,就像字串中的『\0』 一樣。不同的編譯器結束標誌可能會不一樣。
如果是多重繼承並且無虛函式覆蓋
1.每乙個父類都有自己的虛表
2.子類 的虛成員函式被放到了第乙個父類 的表中(按照宣告的順序的第乙個)。
如果有虛函式覆蓋,則覆蓋的函式被放在虛表中原來父類虛函式的位置。沒有被覆蓋 的函式依舊。
基類的指標指向子類的物件,這個指標只能呼叫基類的成員函式,
pt->run(); //『class animal』 has no member named 『run』 pt->run();
//會報錯,任何妄圖使用父類指標想呼叫子類中的未覆蓋父類的成員函式的行為都會被編譯器視為非法。所以根本無法編譯通過,並且這個指標只能呼叫基類的成員函式,如果想在子類中重寫這個函式,必須在基類中這個函式前加上乙個virtual,否則如果子類和基類 中都有這個函式,則會呼叫基類中的這個函式,因為是基類型別的指標。如果還想呼叫這個函式可以在子類的這個函式裡加上animal::eat(),比如:
void fish::eat()
C 虛函式與虛函式表
概念 虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的,簡稱為v table。學習虛函式的作用 理解 c 實現多型的機制 解決了繼承 覆蓋的問題。以下摘抄自 http www.cppblog.com xczhang archive 2008 01 2...
C 虛函式與虛函式表
多型性可分為兩類 靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,動態多型性是通過虛函式實現的。每個含有虛函式的類有一張虛函式表 vtbl 表中每一項是乙個虛函式的位址,也就是說,虛函式表的每一項是乙個虛函式的指標。沒有虛函式的c 類,是不會有虛函式表的。兩張圖 簡單例子 1 inc...
C 虛函式與虛函式表
1 多型是c 三大特性之一,也是物件導向設計中乙個非常重要的概念。所謂多型性就是當 不同的物件接收到相同的訊息時所產生的不同的響應。c 中虛函式的存在其實就是為了解決物件導向程式設計設計當中的多型問題,即通過基類的指標 或者是引用 指向例項化 的派生類物件,從而通過基類的指標 或者是引用 呼叫派生類...