1:動態多型
動態繫結:在程式執行期間(非編譯期間)判斷所引用物件的實際型別,根據其實際型別呼叫相應的方法。
2:動態多型具體實現、
class a
virtual
void funtest2()
int _a;
};class b1 : public a
virtual
void funtest3()
int _b1;
};void funtest(a &s)
int main()
在funtest函式裡面用基類的引用作為引數,真正傳過去的是派生類的物件,而且在派生類裡面是對funtest1函式進行了重寫的,所以在執行期間會根據所引用的具體型別呼叫相應的函式。
3:虛表的簡單檢視
通過求取b1類的大小可以在記憶體中檢視b1的儲存方式,圖上所表示的是虛表指標指向的虛表和列印出來的虛表的實際對應.通過對b1物件記憶體的分析可以知道除了b1所含的兩個整型意外,最上面的四個位元組就是虛表指標,指向的虛表通過列印的方式顯示出來如圖中所示,由於b1對a類是公有繼承而且在b1類中對基類的funtest1函式進行了重寫,所以派生類b1的虛表就應該是圖中所顯示的內容。
如圖所示,就是c類物件在記憶體空間的具體儲存,紅色線所指函式或者數字即為c類物件中的指標所指內容,要麼是偏移量大小,要麼是虛表指標,特別之處在於兩個 『-4』,表示的是從該位置向上偏移四個位元組才是c通過這個繼承體系繼承的b1,b2 類在c中儲存的起始位置。12和24就是偏移量大小,若c b1 b2需要訪問基類成員所需要偏移的位元組數。
虛表指標和虛表
父類中有虛函式,父類繼承子類後 1 有各自的虛表指標和虛表 2 對於子類中未被重寫的虛函式,在父子類各自虛表中儲存的函式位址都是父類中的虛函式位址 3 對於子類中被重寫的虛函式,在父子類各自的虛表中儲存的函式位址是不同的 exp1 無覆蓋時 include using namespace std c...
關於C 虛表和虛指標
以下為個人的一些理解,如有不對,敬請大家斧正。class base virtual void fun class derive base virtual void act 虛表是c 用於實現多型的一種方式,每個擁有虛函式的類編譯器都會為之分配一張虛表,指向虛表的指標即為虛指標,例如以上兩個類base...
虛指標和虛表
所以當用sizeof來獲取含有虛函式的類的大小的時候,會發現結果 比 裡面還有的資料 大4個位元組。這四個位元組就是 虛 指標。32位系統 子類裡面有父類的成員變數。當然,父類有虛函式,自然 子類 就有虛函式。虛表裡放的都是虛函式的指標,指向虛函式的位址。子類即使沒有重寫 父類的 虛函式,子類的虛表...