面向物件語言引入類別概念,封裝資料與操作。C 語言 struct 僅能封裝資料。本文示範以 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; int b;
};
C_Class B { // B 繼承 A
C_Class B* B_this; // 順序關鍵:基類成員在前
void (*Foo)(C_Class B* B_this); // 虛函式
int a; int 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(C_Class A* p) {
p->Foo = A_Foo; p->a = 1; p->b = 2; p->A_this = p;
}
void B_Creat(C_Class 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); // It is B_Fun (一般成員函式)
return 0;
}
11
It is B.c=13
It is A.a=1
It is B_Fun
Foo 對應虛函式,建構函式 (A_Creat/B_Creat) 設定實際函式位址。A_this/B_this 分別指向各自結構體起始位址,多態呼叫時傳遞正確 this。ma = (C_Class A*)mb 將衍生類指標隱性轉換為基類指標,呼叫 Foo 時實際執行 B_Foo。B_F2 直接呼叫,不經函式指標,效率較高。此模擬揭示 C++ 物件模型底層運作:虛函式透過函式指標實現動態綁定,繼承靠記憶體佈局相容,多態靠基類指標指向衍生物件。理解此機制有助於深入掌握 C++ 效能與行為特性。