1 對象模型
1.1 簡單對象模型
簡單對象模型
- 每個
slot
指向一個members
,包括數據以及函數members
本身不在object
中,僅包含指向members的指針- $ object_size = ptr_size * members_num $
2.2 表格驅動
表格驅動模型
data member table
存儲數據本身member function table
每個slot
對應一個member function
object
僅包含data member table
以及member function table
兩個指針
2.3 c++對象模型
c++ 對象模型
- 從簡單對象模型派生
virtual table[vtbl]
:存儲virtual functions
指針的表格,一般放在object
表格第一個slot
處,稱為vptr
,vptr
的設定與重置由該class的構造函數或者復制運算符自動完成。object
存儲非靜態數據以及非靜態函數以及虛擬地址表- 優點:空間以及存取時間效率;缺點:對象的非靜態數據成員改變時,需要重新編譯
2.4 關于繼承
多重繼承
- 繼承沒有深度上的限制
2.5 關于多態
子類對象與指針的可能布局
其中ZooAnimal的子類為Bear
- 多態轉換會造成對象的分割:
```cpp
Bear *bear = new Bear;
ZooAnimal *zoo_animal = (ZooAnimal *)bear;
```
+ zoo_animal只能訪問ZooAnimal所擁有的部分
+ 轉換只能使用指針或者引用
- 對于虛函數,子類實際上是重寫了虛函數地址表中函數地址,因此對于zoo_animal來講,其如果存在虛函數,調用的是Bear中的實現。該操作是在程序運行過程中實現。