C++ 編譯器透過虛函數表(VTABLE)實現多態。在 C 中需手動裝配類似機制。
void** vtable 陣列保存函數指標,並有 int vt_size 指明長度。struct base {
void **vtable;
int vt_size;
void (*func_1)(struct base *b);
int (*func_2)(struct base *b, int x);
void (*deletor)(struct base *b); // 虛析構函數
};
struct derived {
struct base b;
int i;
};
struct derived_2 {
struct derived d;
char *name;
};

假設 derived 實現 3 個虛函數,derived_2 實現 2 個(func_2 未重寫),最終虛函數表長度 9。若為 derived 實例則長度 6。
new_xxx() 與 initialize_xxx()。new 配置記憶體並呼叫基類 initialize,再呼叫自身 initialize 修改虛函數表。deletor 遍歷虛函數表從後往前呼叫,確保派生類至基類順序銷毀。func_1 時,基類實現會查表找到 derived_2_func_1 並執行,行為與 C++ 一致。基類必須實現所有虛函數,否則機制無法運轉。