C++ 類含 virtual 函數時,編譯器生成 vptr(虛表指針) 指向 vtbl(虛函數表)。VC 中 Interface 宏實為 struct,揭示了本質:結構體封裝函數指針數組即可模擬純虛類。
typedef struct {
void (*Foo1)();
char (*Foo2)();
char* (*Foo3)(char* st);
} MyVirtualInterface;
主類 DoMyAct 持有 MyVirtualInterface *m_pInterface:
void DoMyAct_SetInterface(MyVirtualInterface* p) { m_pInterface = p; }
void DoMyAct_Do() {
if (!m_pInterface) return;
m_pInterface->Foo1();
char c = m_pInterface->Foo2();
}
子類 Act1 實現虛結構,管理對象池:
MyVirtualInterface st[MAX];
MyVirtualInterface* Act1_CreateInterface() {
int index = FindValid(); // 對象池或 malloc
if (index == -1) return NULL;
st[index].Foo1 = Act1_Foo1;
st[index].Foo2 = Act1_Foo2;
st[index].Foo3 = Act1_Foo3;
return &st[index];
}
Act2 同理。main 中統一管理:
List_AddObject(&List, Act1_CreateInterface());
while (p = List_GetObject()) {
DoMyAct_SetInterface(p);
DoMyAct_Do(); // 不關心具體實現,just do it
}
switch-case,實現開閉原則。malloc/free。