首先聲明一點(diǎn),虛表并非是C 語言的官方標(biāo)準(zhǔn)的一部分,只是各家編譯器廠商在實現(xiàn)多態(tài)時的解決方案。另外即使同為虛表不同的編譯器對于虛表的設(shè)計可能也是不同的,本文主要基于Itanium C ABI
(適用于gcc和clang)。
從C的POD類型到C 的類
首先回顧一下C語言純POD的結(jié)構(gòu)體(struct)。如果用C語言實現(xiàn)一個類似面向?qū)ο蟮念悾瑧?yīng)該怎么做呢?
寫法一
#include?
typedef?struct?Actress?{
????int?height;?//?身高
????int?weight;?//?體重
????int?age;????//?年齡(注意,這不是數(shù)據(jù)庫,不必一定存儲生日)
????void?(*desc)(struct?Actress*);
}?Actress;
//?obj中各個字段的值不一定被初始化過,
//?通常還會在類內(nèi)定義一個類似構(gòu)造函數(shù)的函數(shù)指針,這里簡化
void?profile(Actress*?obj)?{
????printf("height:%d?weight:%d?age:%d\n",?obj->height,?obj->weight,?obj->age);
}
int?main()?{
????Actress?a;
????a.height?=?168;
????a.weight?=?50;
????a.age?=?20;
????a.desc?=?profile;
????a.desc(