C語言物件導向程式設計(一) 封裝與繼承

2021-08-09 12:53:47 字數 2498 閱讀 4848

最近在用 c 做專案,之前用慣了 c++ ,轉回頭來用c 還真有點不適應。 c++ 語言中自帶物件導向支援,如封裝、繼承、多型等物件導向的基本特徵。 c 原本是面向過程的語言,自身沒有內建這些特性,但我們還是可以利用 c 語言本身已有的特性來實現物件導向的一些基本特徵。接下來我們就一一來細說封裝、繼承、多型、純虛類等物件導向特性在 c 語言中如何實現,並且給出例項。

這篇文章中我們先說封裝和繼承。

先來看封裝。

所謂封裝,通俗地說,就是乙個姑娘化了妝,只給你看她想讓你看的那一面,至於裡面是否刮了骨、墊了東西,不給你看。說到封裝就得說隱藏,這是對兄弟概念;其實我理解隱藏是更深的封裝,完全不給你看見,而封裝可能是猶抱琵琶半遮面。封裝在 c++ 語言中有 protected 、 private 關鍵字在語言層面上支援,而 c 語言中沒有這些。 c 有結構體( struct ),其實可以實現封裝和隱藏。

在 qt 中,為了更好的隱藏乙個類的具體實現,一般是乙個公開標頭檔案、乙個私有標頭檔案,私有標頭檔案中定義實現的內部細節,公開標頭檔案中定義開放給客戶程式設計師的介面和公共資料。看看 qobject (qobject.h ),對應有乙個 qobjectprivate (qobject_p.h ) ,其他的也類似。而**框架如下:

[cpp]view plain

copy

print?

qobject;  

qobject;
我們在 c 語言中完全可以用同樣的方法來實現封裝和隱藏,只不過是放在結構體中而已。**框架如下:

[cpp]view plain

copy

print?

struct st_abc_private;  

struct st_abc ;  

struct st_abc_private;

struct st_abc ;

上面的**,我們隻前向宣告結構體 struct st_abc_private ,沒人知道它裡面具體是什麼東西。假如 struct st_abc 對應的標頭檔案是 abc.h ,那麼把 st_abc_private 的宣告放在 abc_p.h 中,abc.c 檔案包含 abc_p.h ,那麼在實現 struct st_abc 的函式指標 xyz_func 時如何使用 struct st_abc_private ,客戶程式設計師根本無須知道。

這樣做的好處是顯而易見的,除了預定義好的介面,客戶程式設計師完全不需要知道實現細節,即便實現經過重構完全重來,客戶程式設計師也不需要關注,甚至相應的模組連重新編譯都不要——因為 abc.h 自始至終都沒變過。

上面**有個問題,客戶程式設計師如何得到 struct st_abc 的乙個例項,他不知道 struct st_abc_private 如何實現的呀。 c 中沒有建構函式,只好我們自己提供了:我們可以在 abc.h 中宣告乙個類似建構函式的函式來生成 struct st_abc 的例項,名字就叫作 new_abc() ,函式原型如下:

[cpp]view plain

copy

print?

struct st_abc * new_abc();  

struct st_abc * new_abc();
至於實現,我們放在 abc.c 中,客戶程式設計師不需要知道。相應的,還有個類似析構函式的函式,原型如下:

[cpp]view plain

copy

print?

void delete_abc(struct st_abc *);  

void delete_abc(struct st_abc *);

到現在為止,封裝和隱藏就實現了,而且很徹底。接下來看繼承。

什麼是繼承?在物件導向層面上不講了,只說語法層面。語法層面上講,繼承就是派生類擁有父類的資料、方法,又添了點自己的東西,所謂子承父業,發揚光大。在 c 語言中可以用結構體的包含來實現繼承關係。**框架如下:

[cpp]view plain

copy

print?

struct st_base;  

struct st_derived;  

struct st_base;

struct st_derived;

**上就是這麼簡單,不過有一點要注意:第一點就是派生類(結構體)中一定要把父類型別的成員放在第乙個。

繼承在語法層面上看,有資料成員、函式,資料成員通過上面的方法自動就「繼承」了,至於函式,在結構體表示為函式指標,其實也是乙個資料成員,是個指標而已,也會自動「繼承」。之所以還要在這裡列出來說明,是因為 c++ 中有乙個很重要的概念:過載。要在 c 中完整實現有點兒麻煩。

過載,我們常說的過載大概有三種含義:

我們平常在交流時通常不明確區分上面三種型別的過載,這裡出於習慣,也不作區分。

好了,第一篇就到這裡,有時間會往下續。

js物件導向程式設計一 封裝

js是物件導向程式設計的語言,既是它的函式,陣列,屬性都是物件,可以設定物件的屬性和方法。一.生成物件的原始模式 假定把貓看成乙個物件,它有name和color兩個屬性.var cat 現在,我們需要根據這個原型物件的規格,生成兩個例項物件.var cat1 建立乙個空物件 cat1.name 大毛...

一 封裝(C物件導向開發)

內容參考於 抽象接 術和元件開發規範及其思想 在c語言中,可以使用乙個c檔案 c 檔案 和 件完 h 檔案 成 類 的定義,將所有需要封裝的東西都存於c 檔案中,h 檔案中只展現那些對外可見 無需封裝 重點 的內容。1.示例1 乙個棧物件的例子。stack.h ifndef stack h defi...

C 物件導向(一)封裝 類和物件

封裝 繼承 多型 封裝 組織 的過程,將 組織為乙個方法,將方法組織成類,將類組成元件,不同的元件組織為乙個系統。封裝可以方便使用者使用,並且能夠保證 的穩定性,安全性。類 一組相似物件的統稱。物件 乙個例項,是類的實現。類與物件的關係類物件 抽象具體 無狀態有狀態 是物件的模板 是類的例項 類與類...