今天來繼續學習c++物件模型!
在c++編譯器內部,類可以理解為結構體
子類是由父類成員疊加子類新成員得到的
下面來寫乙個程式分析c++的繼承類的模型:
#include
#include
using
namespace
std;
class demo
};class derived : public demo
void print()
};struct test
;int main()
(注意以上程式用編譯器是gcc編譯器,所以結構體的位元組對齊是4位元組預設)
執行結果為:
那麼久引出了問題:c++多型的實現原理是什麼?
c++多型的實現原理:
當類中宣告乙個虛函式時,編譯器會在類中生成乙個虛函式表
虛函式表是乙個儲存成員函式位址的資料結構
虛函式表是由編譯器自動生成與維護的
virtual成員函式,會被編譯器放進虛函式表中
存在虛函式時,每個物件中都有乙個指向虛函式表的指標
如下圖:
virtual成員函式,會被編譯器放進虛函式表中
存在虛函式時,每個物件中都有乙個指向虛函式表的指標
我們會發現,虛函式的呼叫過程比普通函式的呼叫過程複雜,所以虛函式的執行效率低於普通成員函式:
51-2.c為:
#include "51-2.h"
#include "malloc.h"
static
int demo_virtual_add(demo* pthis, int
value);
static
int derived_virtual_add(demo* pthis, int
value);
struct vtable // 2. 定義虛函式表資料結構
;struct classdemo
;struct classderived
;static
struct vtable g_demo_vtbl = //static關鍵字將該虛函式表隱藏在當前檔案內,外部不可見
//類似於c++中虛函式表是自動生成的,外部不可見。
;static
struct vtable g_derived_vtbl =
;demo* demo_create(int i, int j)
return ret;
}int demo_geti(demo* pthis)
int demo_getj(demo* pthis)
// 6. 定義虛函式表中指標所指向的具體函式
static
int demo_virtual_add(demo* pthis, int
value)
// 5. 分析具體的虛函式!!!!
int demo_add(demo* pthis, int
value)
void demo_free(demo* pthis)
derived* derived_create(int i, int j, int k) //等同於建構函式
return ret;
}int derived_getk(derived* pthis)
static
int derived_virtual_add(demo* pthis, int
value)
int derived_add(derived* pthis, int
value)
main.c為:
#include "stdio.h"
#include "51-2.h"
void run(demo* p, int v)
int main()
總結:繼承的本質就是父子間成員變數的疊加
c++中的多型是通過虛函式表實現的
虛函式表,是由編譯器自動生成與維護的
虛函式的呼叫效率低於普通成員函式的呼叫效率
C 深度剖析教程38 類模板深度剖析
類模板可以定義任意多個不同的型別引數 類模板可以被特化 類模板的特化型別 看 include include using namespace std template typename t1,typename t2 class test template typename t1,typename t...
深度探索C 物件模型
傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷 譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你...
深度探索C 物件模型
傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你 ...