面向對象語言引入類概念,屬程式設計思想的進化。類封裝特定資料與操作;C 語言 struct 僅為資料集合。本文示範如何用 C 結構體與函數指標模擬 C++ 的類、繼承、虛函數與多態。
#ifndef C_Class
#define C_Class struct
#endif
C_Class A {
C_Class A *A_this;
void (*Foo)(C_Class A *A_this); // 虛函數指標
int a, b;
};
C_Class B { // B 繼承 A
C_Class B *B_this; // 順序關鍵:基類成員在前
void (*Foo)(C_Class B *B_this);
int a, b;
int c;
};
void B_F2(C_Class B *B_this) { printf("It is B_Fun\n"); }
void A_Foo(C_Class A *A_this) { printf("It is A.a=%d\n", A_this->a); }
void B_Foo(C_Class B *B_this) { printf("It is B.c=%d\n", B_this->c); }
void A_Creat(struct A* p) {
p->Foo = A_Foo; p->a = 1; p->b = 2; p->A_this = p;
}
void B_Creat(struct B* p) {
p->Foo = B_Foo; p->a = 11; p->b = 12; p->c = 13; p->B_this = p;
}
int main() {
C_Class A *ma, a; C_Class B *mb, b;
A_Creat(&a); B_Creat(&b);
mb = &b; ma = &a;
ma = (C_Class A*)mb; // 多態指標:基類指標指向派生對象
printf("%d\n", ma->a); // 11 (B 的 a)
ma->Foo(ma); // 多態調用:It is B.c=13
a.Foo(&a); // 靜態調用:It is A.a=1
B_F2(&b); // 普通成員函數
return 0;
}
Foo,建構時指派對應函數位址。A_this/B_this),對應 C++ 隱含 this。11
It is B.c=13
It is A.a=1
It is B_Fun
此模型揭示 C++ 物件模型底層運作:繼承即記憶體佈局延伸,虛函數即函數指標表,多態即基類指標調用派生類函數指標。