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

C語言實現面向對象特性(一):封裝與繼承的核心模式

     編輯:關於C

從 C++ 轉回 C 開發時,最讓人不適應的是失去了封裝、繼承、多態等語言級支持。但 C 語言靈活的結構體、函數指針、前向聲明等特性,足以構建出功能完備的面向對象框架。本文作為系列首篇,深入講解如何在 C 中實現封裝與繼承,並給出典型代碼模式。

一、 封裝:接口與實現分離

C++ 中用 private/protected 隱藏細節,C 中通過不透明指針模式實現:

1. 雙頭文件模式

  • abc.h(公開頭文件):僅聲明公開結構體 struct st_abc、公開方法指針、構造/析構函數聲明。
  • abc_p.h(私有頭文件):定義私有結構體 struct st_abc_private 完整內容。
  • abc.c:包含 abc_p.h,實現所有方法,客戶代碼只包含 abc.h,完全看不見私有細節。

2. 代碼骨架

/* abc.h - 公開接口 */
struct st_abc_private; // 前向聲明,隱藏定義

struct st_abc {
    int a; // 公開數據成員
    void (*xyz_func)(struct st_abc *); // 公開方法
    struct st_abc_private *priv; // 私有數據指針
};

// 構造/析構函數聲明
struct st_abc *new_abc();
void delete_abc(struct st_abc *);
/* abc_p.h - 私有定義,僅 abc.c 可見 */
struct st_abc_private {
    int hidden_data;
    char *buffer;
    // 任意內部實現細節
};
/* abc.c - 實現 */
#include "abc.h"
#include "abc_p.h"
#include 

static void xyz_func_impl(struct st_abc *this) {
    // 可直接訪問 this->priv->hidden_data
}

struct st_abc *new_abc() {
    struct st_abc *obj = malloc(sizeof(struct st_abc));
    obj->priv = malloc(sizeof(struct st_abc_private));
    obj->a = 0;
    obj->xyz_func = xyz_func_impl;
    // 初始化 priv 成員...
    return obj;
}

void delete_abc(struct st_abc *obj) {
    if (obj) {
        free(obj->priv);
        free(obj);
    }
}

3. 優勢

  • 完全隱藏實現:客戶代碼只依賴穩定的 abc.h,內部重構不影響客戶編譯。
  • 二進制兼容:只要公開接口不變,動態庫升級無需重新編譯上層應用。
  • 模擬 C++ 編譯防火牆:達到同等封裝效果。

二、 繼承:結構體包含與首成員技巧

C++ 繼承本質是基類成員在派生類對象中的固定偏移佈局。C 中通過結構體包含模擬:

1. 基礎模式

struct st_base {
    int base_data;
    void (*base_method)(struct st_base *);
};

struct st_derived {
    struct st_base base; // 必須作為第一個成員
    int derived_data;
    void (*derived_method)(struct st_derived *);
};

2. 關鍵規則:基類成員必須放在第一位

這樣 struct st_derived * 強轉為 struct st_base * 時地址不變,可直接調用基類方法,實現「子類指針隱式轉換為父類指針」。

3. 方法「繼承」與覆蓋

  • 數據成員自動包含。
  • 方法通過函數指針實現:構造函數中將派生類的函數指針賦值給基類成員函數指針,實現覆蓋;或保留基類指針並在派生類中提供新方法。
  • 不支持函數重載(C 編譯器不支持同名不同參函數),但影響較小。

4. 虛函數與多態預演

基類函數指針作為「虛函數表」雛形,派生類構造時填入具體實現,調用時通過對象指針間接調用,即實現運行時多態。下一篇將詳細展開。

三、 總結與展望

本文確立了 C 語言面向對象編程的兩大基石:

  1. 封裝:不透明指針 + 雙頭文件 + 構造/析構函數,實現接口與實現完全分離。
  2. 繼承:結構體首成員包含 + 函數指針覆蓋,模擬 C++ 對象佈局與方法調用機制。

下一篇將深入講解多態的完整實現(虛函數表模擬)、純虛類/接口模式,並給出綜合示例代碼。

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