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