PLOOC-裸機思維
PLOOC-git
OOPC精要——撩開“對象”的神秘面紗
C/C++面向對象編程之封裝-KK
- 面向過程,本質是“順序,循環,分支”
- 面向對象,本質是“繼承,封裝,多態”
- 參考的書籍:《UML+OOPC嵌入式C語言開發精講》
其他相關
SimonQian
VSF
GMSI
裸機思維
傻孩子
simple_fsm
其他相關
LW-OOPC(高煥堂(臺灣))
如何使用
參考 LW_OOPC宏配置及使用指南.md
是如何面向對象的?
繼承-通過 結構體嵌套 模擬繼承
基類成員放在子類結構體的開頭,保證內存布局兼容。
子類可以訪問基類成員,并擴展新的成員。
封裝-結構體(struct)封裝數據成員,并利用函數指針(function pointers)模擬方法
缺點是所有的成員和方法都是暴露的;
多態:通過統一的接口訪問不同底層實現的能力
虛函數表(VTable):模擬 C++ 的虛函數機制
接口抽象:通過結構體指針實現接口的多態調用
方法重寫:子類重新定義父類的虛函數
需要解決:如何在運行時決定調用哪個具體函數?
缺點
接口類(Interface)、抽象類(Abstract Class)和具體類(Concrete Class) 是三種不同的類類型
接口類(Interface)
特點:
純抽象:只包含 抽象方法(無具體實現),不能有成員變量(C++/Java)或可以有靜態常量(Java)。
多繼承支持:一個類可以實現多個接口(彌補單繼承的不足)。
強調行為契約:定義“能做什么”,不關心“如何做”。
無構造函數:不能被實例化
抽象類(Abstract Class)
特點:
部分抽象:可以包含 抽象方法(無實現)和 具體方法(有實現)。
可以有成員變量:普通字段或常量。
單繼承限制:一個類只能繼承一個抽象類。
不能實例化(沒有new方法):必須由子類繼承并實現抽象方法后使用。
具體類(Concrete Class)
特點:
完全實現:所有方法都有具體實現(無抽象方法)。
可直接實例化:通過 new 創建對象。
可繼承抽象類或實現接口:必須實現所有繼承的抽象方法。
比較
為什么需要FUNCTION_SETTING
實現了該類的創建、方法的動態綁定
作用是動態綁定方法到類的函數指針,而不是直接調用已實現的函數。這樣做的主要目的是為了實現 多態(Polymorphism) 和 運行時方法綁定,從而讓代碼更加靈活、可擴展。
FUNCTION_SETTING 的作用是 把函數指針綁定到類的虛方法表(vtable),使得在運行時可以根據對象類型動態調用正確的方法。
使用動態的綁定,提供了修改父類方法的地方,
針對父類的方法,其參數還是父類的參數,Animal* t
子類的方法用了子類的參數
子類->父類
父類->子類
如果 Dog_move(接口方法)需要訪問 Dog 類的成員變量
使用 SUB_PTR宏反向轉換:
由于 Dog 實現了 IMoveable,可以通過結構體內存布局的偏移量,從 IMoveable* 轉回 Dog*
/* Dog 的移動行為(需要訪問 Dog 的成員變量) */
void Dog_move(IMoveable* t) {// 將 IMoveable* 轉為 Dog*Dog* dog= SUB_PTR(t, Animal, Dog);// 現在可以訪問 Dog 的成員變量Animal* animal = SUPER_PTR(dog, Animal);printf("狗[%s]在地上跑,年齡%d歲!\n", animal->name, animal->age);
}
內存泄漏(Memory Leak)
通常指由于面向對象編程模式在 C 語言中的特殊實現方式(如動態內存分配、對象生命周期管理不當)導致的內存未能正確釋放的問題。
其他相關
金永華
Akagi201
Akagi201博客
關于-LW_OOPC學習01
基本概念回顧
抽象類Vs接口