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