1.虛函數的實現原理(http://www.cnblogs.com/malecrab/p/5572730.html)
如果一個類含有虛函數,那麼編譯器會爲該類生成一個與之對應的虛函數表,其中存放着該類所有的虛函數對應的虛函數指針。虛函數表每一行對應一個虛函數的地址。
那麼類的對象是如何找到虛函數表的呢?
對於含有虛函數的類,構造該類的對象時,會自動的爲其添加一個虛函數表指針vptr,vptr指向類的虛函數表。
虛函數的調用
void test(B *pb) {
pb->bar();
}
pb可能指向B的對象,也可能指向其派生類的對象,但是不論B還是D,其中的bar()在對應的虛函數表中偏移是一樣,如果pb指向B,那麼就會調用B.bar(),如果pb指向D,那麼就會調用D.bar(),實現多態。