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

C語言實現面向對象:虛函數與多態(虛函數表機制模擬)

     編輯:關於C語言

背景

C++ 編譯器透過虛函數表(VTABLE)實現多態。在 C 中需手動裝配類似機制。

設計思路

  • 基類顯式宣告 void** vtable 陣列保存函數指標,並有 int vt_size 指明長度。
  • 基類定義的每個虛函數在表中位置、順序固定(約定)。
  • 派生類必須填充基類虛函數表(可動態增長),未重寫處置 0。
  • 基類函數實現中遍歷虛函數表,尋找繼承鏈中最後一個非 0 的函數指標並呼叫。

結構體定義

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++ 一致。

基類必須實現所有虛函數,否則機制無法運轉。

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