物件記憶體模型(虛函式,虛函式表,虛指標)

2021-08-21 18:03:59 字數 846 閱讀 9395

**:

從例子入手,考察如下帶有虛函式的類的物件記憶體模型:

1 class a ; 

11 12 class b : a ;

20 21 class c : b ;

注:在子類中出現與父類相同名稱的變數和非虛函式不是最佳實踐,這裡是為了說明其記憶體結構。

其物件記憶體結構見下圖。

***於侯捷老師

對其分析如下:

1. 每個含有虛函式的類在記憶體中多一根指標(vptr),見圖中a,b,c物件中第乙個位置,儲存的是虛函式表(vtbl)所在的位置。

2. 虛函式表(vtbl)儲存著所有虛函式的位置,由於其動態繫結特性,在覆寫(override)後在子類中儲存的虛函式位置與父類中不相同。

3. 分析上述**, b繼承a,所以a中的資料部分也被b繼承下來,同時b新增上了自己的資料部分m_data3,加之vptr,組成了b左側的記憶體布局。

a中的虛函式vfunc1(),vfunc2()可以被覆寫和動態繫結。

所以在b中,vfunc1()被覆寫,其vtbl中對應項指向了新的函式的位置(亮藍色)。vfunc2()未被覆寫,仍然指向原先位置(深藍色)。

c與b同理,vfunc1()被覆寫,其vtbl中對應項指向了新的函式的位置(橘黃色)。vfunc2()未被覆寫,仍然指向原先位置(深藍色)。

非虛函式靜態繫結,儲存在單獨的記憶體空間(code memory section,灰色函式部分),呼叫時把物件的this指標,傳給乙個invisible引數,以便確定誰在呼叫函式。

4. 呼叫虛函式的語句的c語言形式如圖中下部分所示,其中n表示對應的函式在第幾個位置(編譯器在建立虛函式表的時候已知),從而實現動態繫結。

虛指標,虛函式,虛函式表,純虛函式

虛指標 虛繼承 在使用多重繼承時,如存在 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 時 存在以下記憶體儲存順序 虛指標 指向...

虛函式表指標,虛函式表

對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...

虛函式,虛繼承與虛函式表

c 實現多型機制 模板技術,rtti 技術,虛函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議 虛函式 帶有 關鍵字的函式,並且不帶有 標誌的 虛繼承帶有 關鍵字的繼承,基類被稱為虛基類,會在自己物件的例項中產生虛基類指標 虛函式與菱形繼承的問題 當發生繼承時,如果派生類重寫了基類的虛函...