object model 關於物件

2021-07-16 18:27:42 字數 3542 閱讀 6758

a)物件的構成

i. 類中包含static

、nostatic

成員變數和

static

、nostatic

、virtual

成員函式。在物件中僅僅存放【nostatic成員變數

】和指向virtual

成員函式的表的【虛表指標】以及乙個【type_info物件實際型別

】,static

成員自然儲存在全域性靜態區,而普通成員函式,則會以

point::float x()const{}

這種形式和其他普通函式一樣儲存。(只不過在前面加上【類名

::】,並在類中留下宣告而已)

b)加入單繼承,子類物件的構成

i. 【子類虛表指標】+

從父類繼承來的nostatic

成員變數和成員函式宣告

】+【子類自己定義的nostatic

成員變數

】。子類的虛表是先拷貝父類的虛表,按照type_info

物件實際型別修改拷貝來的虛表,然後在拷貝的虛表後面加上自己虛函式的函式位址指標

基類:物件中包含非靜態變數count

,物件型別

typeinfo

,以及含有虛函式位址表的指標

不過載基類虛函式的子類:物件中包含子類物件自己的虛表指標,物件型別typeinfo

,以及從父類繼承下來的成員變數

ibase

子類的虛表【前半部分拷貝的是父類的虛表】,由於沒有過載父類虛函式所以無需修改拷貝來的前半部分虛表,【後半部分是子類自己的虛函式們的位址

過載父類虛函式的子類:其餘與上面一樣,不同的是拷貝自父類的虛函式表,由於過載了虛函式,所以相應部分需要修改,指向子類的修改後的虛函式位址。

結論】:

1.父類物件有父類物件的虛函式表,子類物件有子類物件的虛函式表。

2.子類物件的虛表,前半部分拷貝並修改父類的虛表,後半部分是新新增的子類自己的虛函式表。

3.所謂的多型:就是將子類物件賦值給父類指標(因為子類型別亦是父類型別),如此,【父類指標就可以取得子類物件的虛表指標了】,從而訪問子類物件過載之後的虛函式。實現基類型別取得派生類過載方法的效果。【當然基類指標取得的子類物件雖然不是閹割的,但是指標的基類型別限制了指標只能訪問基類中包含的成員變數和成員函式

c)加入多繼承,子類的物件構成

i. 其餘和單繼承的狀況一樣,不同的是有多個拷貝的基類虛表。對於此的處理如下:基類的虛表按基類的宣告順序來排放;子類新增的虛函式位址放在第乙個基類的拷貝虛表後面(不論轉成哪種基類型別,子類的虛函式以及子類新增的其他東西,作為父類指標雖然獲得了完整的子類物件,但還是訪問不到的,所以其實放在**都一樣

其他測試結論】:上面程式測試表明確實像上圖所繪製的一樣,包含兩個虛表指標,包含多張虛表。有n

個基類就有

n張虛表。【子類物件的構成就像疊羅漢一樣,上面是乙個又乙個從基類們繼承下來的東西,最後才是子類自己新增的東西】。

a) 加入虛繼承,子類物件的構成

i. 虛繼承是為了解決菱形繼承問題。虛繼承的子類物件構成和普通繼承完全不一樣。虛繼承的子類物件的子類部分有單獨的虛函式表,另外也儲存乙份父類的虛函式表,兩部分之間四位元組的0x00000000

作為分界。在子類物件的記憶體中,首先是自己的虛函式表,然後是派生類的成員變數,再後是基類的虛函式表和基類的成員變數

以上參考:

和《深入探索c++

物件模型》

10 C 中的物件模型object model

本篇介紹c 中的物件模型中虛指標vptr,虛表vtbl,動態繫結dynamic binding的相關知識點。如果c 類成員中有虛函式,那麼對應的物件中就有除了本身資料外的虛指標vptr 4個位元組 虛指標指向虛表vtbl,虛表中存放虛函式的位址。如下圖所示 注意點 如圖當指標p指向物件c,用p呼叫c...

關於this物件

js中this的四種用法 在一般函式方法中使用this指代全域性物件 預設繫結 var x 1 function test test 1作為物件方法呼叫,this指向上級物件 隱式繫結 function test var obj obj.func 1作為構造函式呼叫,this指代new出的物件 ne...

C 物件模型 關於物件

關於物件 有兩種資料成員 static 和nonstatic 以及三種成員函式 static nonstatic 和virtual c 物件模型對記憶體空間和訪問時間做了優化,nonstatic 的資料成員被置於類物件之內,而 static 資料成員被置於類物件之外。函式則全部放在物件之外。下面的程...