1. 程式人生 > >C語言實現面向物件思想

C語言實現面向物件思想

1. 使用結構體實現物件
這裡寫圖片描述
與 C++不同的是, C 語言定義的成員函式增加了一個額外引數: lpThis,這是最關鍵的一點。實際上, C++語言在呼叫成員函式的時候,也隱含了一個指向自身的引數( this指標),因為 C 語言不支援這種隱含機制,因此需要明確的指定指向自身的引數。
呼叫:
CommonObject.GetObjectType(&CommonObject);

2. 利用巨集定義實現繼承
這裡寫圖片描述
繼承:
這裡寫圖片描述
3. 使用強制轉換實現動態型別
這裡寫圖片描述
4. 資源的釋放
1.每個複雜的物件(簡單的物件,比如臨時使用的簡單型別等不包含在內),在宣告的時候, 都宣告兩個函式: Initialize 和 Uninitialize, 其中第一個函式對物件進行初始化,第二個函式對物件的資源進行釋放,然後定義一個全域性陣列,陣列內包含了所有物件的初始化函式和反初始化函式;
2. 定義一個全域性物件, 對系統中所有物件進行管理, 這個物件的名字是 ObjectManager(物件管理器),該物件提供 CreateObjectDestroyObject等介面,程式碼通過呼叫 CreateObject函式建立物件,當物件需要銷燬時,呼叫 DestroyObject 函式。第一點很容易實現,只要在宣告的時候,額外宣告兩個函式即可(這兩個函式的引數是__COMMON_OBJECT*),宣告完成之後,把這兩個函式新增到全域性陣列中(該陣列包含了系統定義的所有物件相關資訊,比如物件的大小、物件的型別、物件的 Initialize和 Uninitialize 函式等)。物件管理器 ObjectManager 則維護了一個全域性列表, 每建立一個物件, ObjectManager都把新建立的物件插入列表中(實際上是一個以物件型別作為 Key 的 Hash 表)。每建立一個物件 ObjectManager 都申請一塊記憶體(呼叫 KMemAlloc 函式),並根據物件型別,找到該物件對應的 Initialize 數 (通過搜尋物件資訊陣列), 然後呼叫這個函式初始化物件。對於物件的銷燬, ObjectManager 則呼叫物件的 Uninitialize 函式,這樣就實現了物件的自動初始化和物件資源的自動釋放