第一章 關于對象

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處,稱為vptrvptr的設定與重置由該class的構造函數或者復制運算符自動完成。
  • object存儲非靜態數據以及非靜態函數以及虛擬地址表
  • 優點:空間以及存取時間效率;缺點:對象的非靜態數據成員改變時,需要重新編譯

2.4 關于繼承

多重繼承
  • 繼承沒有深度上的限制

2.5 關于多態

子類對象與指針的可能布局

其中ZooAnimal的子類為Bear

  • 多態轉換會造成對象的分割:
```cpp
Bear *bear = new Bear;
ZooAnimal *zoo_animal = (ZooAnimal *)bear;
```
+ zoo_animal只能訪問ZooAnimal所擁有的部分
+ 轉換只能使用指針或者引用
  • 對于虛函數,子類實際上是重寫了虛函數地址表中函數地址,因此對于zoo_animal來講,其如果存在虛函數,調用的是Bear中的實現。該操作是在程序運行過程中實現。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容