天天看點

用C語言寫面向的對象是一種什麼樣的體驗

最近從老東家離職,跳出來跟這幾個以前的老同僚,拉了一個創業團隊,準備幹一票,去之前也了解了一番,此次将使用c語言來開發,對于畢業之後一直從事c++面向對象思維編碼的我來說,雖然不舍,但是仔細想了下,這都不是事,誰說用c語言寫不了面向對象?

衆所周知面向對象的三個特性:封裝性、繼承性、多态性。這幾個特性的具體含義我等會會班門弄斧講一下含義,下面,請允許我先用c++面向對象思維将設計模式中最常用的簡單工廠模式寫一邊,相信這三個特性不言而喻。

以下我将用一個工廠類實作具體汽車的生産,奔馳車、寶馬車、奧迪車都将通過工廠類來生産,由父類指針指向具體的汽車執行個體:

頭檔案:

源代碼:

測試代碼main.cpp

編譯後輸出:

用C語言寫面向的對象是一種什麼樣的體驗

以上便是簡單工廠模式的源碼示例,現在,我們來聊聊為什麼用c語言我們也可以實作這面向對象思維的三大特性:

首先是封裝性:c++的封裝性就是将抽象類的函數和屬性都封裝起來,不對外開放,外部要使用這些屬性和方法都必須通過一個具體執行個體對象去通路這些方法和屬性,而我們知道,c語言中一旦包含了頭檔案便可以使用頭檔案中的函數和變量,其實c語言中也可以用一種方法達到這種效果,那便是使用結構體+函數指針+static,結構體中定義屬性和函數指針,static将方法都限制在本子產品使用,對外部,通過指針函數的方式通路,如此一來,便可以達到面向對象封裝性的實作;

對于繼承性:c++ 面向對象的繼承是可以繼承父類的屬性和方法,在子類對象中的記憶體中是有父類對象的記憶體的,那麼,用c語言來寫的話我們完全可以在父類結構體中定義一個父類變量在其中,在使用構造子類的時候同時構造父類,便可以達到繼承性的特性;

對于多态性:c++中允許一個父類指針指向子類實體,在這個指針使用方法時,若此方法是虛函數,則執行動作會執行到具體的子類函數中,本質的實作方式是通過一個虛函數指針的方式,由于我們用c語言寫面向對象本就是通過函數指針的方式來封裝函數,那我們完全可以将結構體父類的變量的函數指針讓他指向子類的函數來達到多态的特性。

好了,在你們面前班門弄斧了一番,下面開始具體的代碼實作:

源檔案:

測試檔案main.cpp

編譯後執行:

用C語言寫面向的對象是一種什麼樣的體驗

哦,btw,在函數中我使用了本結構體的指針在裡面,是為了達到在函數中使用示例的屬性,這樣就獨立每一個示例的屬性操作了。

作者:憤怒的呆魚

來源:51cto

繼續閱讀