虛函式指標和虛函式表

2022-09-14 22:09:33 字數 2590 閱讀 4017

虛函式指標和虛函式表

虛函式表的定義

多型是由虛函式實現的,而虛函式主要是通過虛函式表(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 時 存在以下記憶體儲存順序 虛指標 指向...