如何在純C中實現類、繼承和多態(小白友好版)

基本實現原理

/* 通過結構體+函數指針模擬類 */
typedef struct {// 成員變量int x;  // 成員方法(函數指針)                  void (*print)(void* self);  
} MyClass;/* 成員函數實現 */
void my_print(void* self) {MyClass* obj = (MyClass*)self;printf("Value: %d\n", obj->x);
}/* 構造函數 */
MyClass* MyClass_create(int x) {MyClass* obj = malloc(sizeof(MyClass));obj->x = x;obj->print = my_print;  // 方法綁定return obj;
}

🔀 三種核心特性實現

1. 封裝

// 頭文件(.h)中只聲明結構體指針
typedef struct HiddenClass HiddenClass;// 源文件(.c)中定義真實結構體
struct HiddenClass {int private_data;void (*public_method)(HiddenClass*);
};

2. 繼承

/* 基類 */
typedef struct {int base_val;void (*base_method)();
} Base;/* 派生類 */
typedef struct {Base super;  // 包含基類實現繼承int derived_val;
} Derived;

3. 多態

typedef struct {void (*speak)();
} Animal;void dog_speak() { printf("汪汪汪\n"); }
void cat_speak() { printf("喵喵喵\n"); }Animal dog = { .speak = dog_speak };
Animal cat = { .speak = cat_speak };

🧩 完整示例:圖形系統

/* 基類:Shape */
typedef struct Shape Shape;
struct Shape {void (*draw)(Shape*);
};/* 派生類:Circle */
typedef struct {Shape parent;  // 繼承int radius;
} Circle;void circle_draw(Shape* self) {Circle* c = (Circle*)self;printf("繪制半徑%d的圓\n", c->radius);
}Circle* create_circle(int r) {Circle* c = malloc(sizeof(Circle));c->parent.draw = circle_draw;c->radius = r;return c;
}

備注

個人水平有限,有問題隨時交流~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81711.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81711.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81711.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

51單片機入門教程——每個音符對應的重裝載值

前言 本教程基于B站江協科技課程進行個人學習整理,專為擁有C語言基礎的零基礎入門51單片機新手設計。既幫助解決因時間差導致的設備迭代調試難題,也助力新手快速掌握51單片機核心知識,實現從C語言理論到單片機實踐應用的高效過渡 。

股票單因子的檢驗方法有哪些?

股票單因子的檢驗方法主要包括以下四類方法及相關指標: 一、統計指標檢驗 IC值分析法 定義:IC值(信息系數)衡量因子值與股票未來收益的相關性,包括兩種計算方式: Normal IC:基于Pearson相關系數…

洛谷 P8606 [藍橋杯 2013 國 B] 高僧斗法 博弈論

題目 傳送門 P8606 [藍橋杯 2013 國 B] 高僧斗法 - 洛谷 思路 這個題就比較考驗博弈的基本題型和轉換能力了; 這個題是nim博弈>階梯博弈 再將小和尚的移動轉化為階梯上石子的移動:兩個小和尚之間可以移動的距離,看做階梯上的石子&…

《政治最后的日子》章節

政治與中世紀教會的類比性衰落 作者提出現代民族國家正重復中世紀教會的衰落軌跡: 兩者均曾作為社會組織核心存在約5個世紀 晚期都成為生產力阻礙(中世紀教會稅收負擔/現代國家官僚低效) 末期均出現管理者普遍腐敗與公眾蔑視(…

微軟開源推理模型:Phi-4-reasoning-plus

Phi-4-reasoning-plus 技術解讀 一、模型概述 Phi-4-reasoning-plus 是微軟研究院開發的一種前沿開源推理模型,基于 Phi-4 通過監督微調和強化學習進一步訓練而成。該模型專注于高質量和高級推理能力的培養,旨在為小型高效模型提供強大的推理性能。其訓…

文學與社會學是否只是在做解釋的工作?

目錄 一、文學:從抒情到解釋的轉變 (一)文學從來不只是“虛構” (二)文學的解釋,是“經驗的再組織” 二、社會學:用理論語言重寫社會現實 (一)社會學的“科學化”與…

Flink基礎整理

文章目錄 前言1.Flink系統架構2.編程模型(API層次結構)3.DataSet和DataStream區別4.Flink的批流統一5.Flink的狀態后端6.Flink有哪些狀態類型7.Flink并行度前言 提示:下面是根據網絡或AI整理: 1.Flink系統架構 用戶在客戶端提交作業(Job)到服務端。服務端為分布式的主從…

mq消息可靠性傳送

mq消息傳送 開啟消息發布確認模式 def publish(self, message):"""發布消息(自動重連)"""for i in range(3):try:message_ json.dumps(message, ensure_asciiFalse)self.ensure_connection()# 開啟 confirm 模式&#x…

【quantity】10 面積單位模塊(area.rs)

一、源碼 我們可以實現面積單位文件,包含k(千)、d(分)、c(厘)、m(毫)前綴的面積量。面積的基本單位是平方米(SquareMeter)。 以下是area.rs的實…

運算放大器的主要技術指標

運放(運算放大器)是一種基礎電子器件,具有輸入阻抗高、開環放大倍數大、輸入端電流小、同相端與反相端電壓幾乎相等等特點。在選型時,需要考慮技術指標如輸入失調電壓、輸入失調電壓漂移、輸入失調電流、共模抑制比、壓擺率、建立…

Docker 服務搭建

💢歡迎來到張翊塵的開源技術站 💥開源如江河,匯聚眾志成。代碼似星辰,照亮行征程。開源精神長,傳承永不忘。攜手共前行,未來更輝煌💥 文章目錄 Docker 服務搭建在 Ubuntu 上安裝 Docker更新軟件…

CRM系統接入DeepSeek大模型應用場景方案

1. 項目背景與目標 在當前數字化轉型的浪潮中,客戶關系管理(CRM)系統已成為企業提升客戶服務效率、優化銷售流程的核心工具。然而,傳統CRM系統普遍面臨數據處理能力有限、客戶洞察深度不足、響應效率低下等問題。例如&#xff0c…

步進電機中斷函數解釋

STM32 motor111.c 中 HAL_TIM_PeriodElapsedCallback 函數逐行解釋 下面我們對 STM32 項目中 motor111.c 文件里的 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函數進行逐行解析,幫助初學者理解每一行代碼的作用。此函數是在定時器產生更新中斷時被調…

什么是Linux中的systemd?

寫在前面 為什么要回過頭來復習linux的system的,最近在研究DELL EMC的PowerStore存儲系統,其底層是基于CoreOS開發的,這套操作系統是基于Systemd來設計的。所以要深入了解PowerStore就必須對systemd做詳細了解。 systemd 是一個用于 Linux …

Linux 環境下 Mysql 5.7 數據定期備份

目錄 一、創建數據備份腳本二、查看備份日志三、數據庫數據恢復 備份策略: 系統環境 openEuler 22.03 (LTS-SP4) 單機備份 每天凌晨2點,指定數據庫表全量備份,只保留近7次備份數據 每次的腳本執行,將會記錄執行結果到日志&#xf…

C 語言字符輸入:掌握 getchar 和 scanf 的用法與陷阱

各類資料學習下載合集 ??https://pan.quark.cn/s/8c91ccb5a474?? C 語言字符輸入:掌握 getchar 和 scanf 的用法與陷阱 你好!在 C 語言編程中,與用戶進行交互最基本的方式就是通過標準輸入和標準輸出。我們之前探討了如何使用 ??printf?? 和 ??putchar?? 進行…

【React】 Hooks useTransition 解析與性能優化實踐

1.背景 useTransition 是 React 18 引入的一個并發模式下的 Hook,用于區分緊急和非緊急的狀態更新,提升應用的響應性和用戶體驗;它可以管理 UI 中的過渡狀態,特別是在處理長時間運行的狀態更新時。它允許你將某些更新標記為“過渡”狀態&…

蘑菇管理——AI與思維模型【94】

一、定義 蘑菇管理思維模型是一種形象地描述組織對待新員工或初入職場者的管理方式及相關現象的思維模型。它將新員工或初入職場者比作蘑菇,這些人在初期往往被置于陰暗的角落(不受重視的部門,或打雜跑腿的工作),澆上…

c++STL——set和map的使用

文章目錄 set和map的使用set系列聲名和定義默認成員函數迭代器set的增刪查lower_bound和upper_boundInsert接口pair類 對于查找的另一種使用 set和multiset的區別 map系列聲名和定義pair類的進一步介紹默認成員函數map的增刪查map的數據修改map和multimap的差異 set和map的使用…

什么是DGI數據治理框架?

DGI數據治理框架是由數據治理研究所(Data Governance Institute, DGI)提出的一套系統性方法論,旨在幫助企業或組織建立有效的數據治理體系,確保數據資產的高質量管理、合規使用和價值釋放。以下是關于DGI數據治理框架的核心內容&a…