首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C 語言模擬 C++ 類別:多態與繼承的手動實作

     編輯:關於C++

前言

面向物件語言引入類別概念,封裝資料與操作。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

關鍵技術點

  1. 繼承模擬:衍生結構體首欄位包含基類結構體 (或指標),確保記憶體佈局相容。
  2. 虛函式表模擬:函式指標成員 Foo 對應虛函式,建構函式 (A_Creat/B_Creat) 設定實際函式位址。
  3. this 指標調整:A_this/B_this 分別指向各自結構體起始位址,多態呼叫時傳遞正確 this。
  4. 多態指標轉換:ma = (C_Class A*)mb 將衍生類指標隱性轉換為基類指標,呼叫 Foo 時實際執行 B_Foo。
  5. 非虛函式:B_F2 直接呼叫,不經函式指標,效率較高。

結語

此模擬揭示 C++ 物件模型底層運作:虛函式透過函式指標實現動態綁定,繼承靠記憶體佈局相容,多態靠基類指標指向衍生物件。理解此機制有助於深入掌握 C++ 效能與行為特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved