虛函式指標和虛函式表
虛函式表的定義
多型是由虛函式實現的,而虛函式主要是通過虛函式表(v-table)來實現的。
如果乙個類中包含虛函式(virtual修飾的函式),那麼這個類就會包含一張虛函式表(vftbl),虛函式表儲存的每一項是乙個虛函式的位址。在乙個物件的記憶體布局中,指向這張虛函式表的指標(vfptr)位於最前端。如下圖:
一般繼承(無虛函式覆蓋)
對於如下uml的類:在普通繼承情況,派生類沒有重寫基類的虛函式:
體現在**上為:
#include using namespace std;
class base
virtual void g()
virtual void h()
};class derive : public base
virtual void g1()
virtual void h1()
};int main()
使用lldb檢視虛函式指標和虛函式表內容:
根據結果,可以得知其虛函式表如下圖:
一般繼承(有虛函式覆蓋)
對於如下uml的類:在普通繼承情況,派生類重寫了基類的虛函式( f() ):
**為:
#include using namespace std;
class base
virtual void g()
virtual void h()
};class derive : public base
virtual void g1()
virtual void h1()
};int main()
結果為:
繪製成圖,為:
多重繼承(無虛函式覆蓋)
對於如下uml的類:在多重繼承情況,派生類沒有重寫了基類的虛函式:
**為:
#include using namespace std;
class base1
virtual void g()
virtual void h()
};class base2
virtual void g()
virtual void h()
};class base3
virtual void g()
virtual void h()
};class derive : public base1, public base2, public base3
virtual void g1()
};int main()
結果為:
繪製成圖,為:
多重繼承(有虛函式覆蓋)
對於如下uml的類:在多重繼承情況,派生類沒有重寫了基類的虛函式:
**為:
#include using namespace std;
class base1
virtual void g()
virtual void h()
};class base2
virtual void g()
virtual void h()
};class base3
virtual void g()
virtual void h()
};class derive : public base1, public base2, public base3
virtual void g1()
};int main()
結果為:
繪製成圖,為:
虛函式表指標,虛函式表
對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...
虛函式表和虛函式表的指標
有虛函式的類都有乙個虛函式表,它是實現多型的關鍵。虛函式表可以繼承,如果子類沒有重寫虛函式,那麼子類虛函式表中仍然會有該函式的位址,只不過這個位址指向的是基類的函式實現。如果子類重寫了相應的虛函式,那麼虛函式表中的位址就會改變,指向自身的函式實現。如果派生類中有自己的虛函式,那麼虛函式表中會新增該項...
虛指標,虛函式,虛函式表,純虛函式
虛指標 虛繼承 在使用多重繼承時,如存在 class a 有m a變數 class a1 virtual public a,m a1 class a2 virtual public a m a2 class b public a1,public a2 m b 時 存在以下記憶體儲存順序 虛指標 指向...