C語言能實現C 的物件導向,為什麼還要有C ?

時間 2021-05-06 15:11:37

1樓:rayshen

架構整潔之道一書有答案

c語言能夠實現物件導向,甚至對於使用c構建大型系統設計來說物件導向是有效控制系統複雜度,模組解耦,架構持續演進的最佳實踐之一,比如作業系統對io裝置的管理就是物件導向的設計。

c可以實現面向的封裝多型繼承以及依賴倒置,實際上c++底層關於物件導向的實現很多就是用c來做的。c++(或者說帶有物件導向屬性的語言)僅僅是降低了物件導向程式設計的成本和放錯機率。

以下摘自原書:

這個簡單的程式設計技巧正是物件導向程式設計中多型的基礎。例如在C++中,類中的每個虛函式(virtual function)的位址都被記錄在乙個名叫vtable的資料結構裡。我們對虛函式的每次呼叫都要先查詢這個表,其衍生類的建構函式負責將該衍生類的虛函式位址載入到整個物件的vtable中。

歸根結底,多型其實不過就是函式指標的一種應用。自從20世紀40年代末期馮·諾依曼架構誕生那天起,程式設計師們就一直在使用函式指標模擬多型了。也就是說,物件導向程式設計在多型方面沒有提出任何新概念。

當然了,物件導向程式設計語言雖然在多型上並沒有理論創新,但它們也確實讓多型變得更安全、更便於使用了。

用函式指標顯式實現多型的問題就在於函式指標的危險性。畢竟,函式指標的呼叫依賴於一系列需要人為遵守的約定。程式設計師必須嚴格按照固定約定來初始化函式指標,並同樣嚴格地按照約定來呼叫這些指標。

只要有乙個程式設計師沒有遵守這些約定,整個程式就會產生極其難以跟蹤和消除的Bug。

物件導向程式設計語言為我們消除了人工遵守這些約定的必要,也就等於消除了這方面的危險性。採用物件導向程式設計語言讓多型實現變得非常簡單,讓乙個傳統C程式設計師可以去做以前不敢想的事情。綜上所述,我們認為物件導向程式設計其實是對程式間接控制權的轉移進行了約束。

2樓:

彙編也可以實現C語言,為何還要C語言?

自己對著電腦處理器施加電壓訊號也可以替代組合語言,為何還要組合語言?連作業系統都不用裝,多省事。

3樓:黃亮anthony

有些功能做不到,簡單舉例:

RAII,這個只能是編譯器做,沒它C++廢了一半的武功。

靜態物件的構造

異常過載運算子

有的功能很難做

函式過載

生成虛表

靜態物件析構

虛繼承執行時型別

4樓:小莊讀書

C++的物件導向是在語言編譯器層面實現的,而用C語言去實現物件導向,則屬於開發層面了。目前,全球也就那麼幾款C++編譯器,用C去實現物件導向,相當於用C語言做乙個C++的編譯器(至少是物件導向部分),不是不能做到,只是投入產出比實在不值當……所以沒必要~~

c語言如何實現物件導向功能?

已登出 知乎天天說go天天let s go,你參考下go怎麼實現物件導向就好了,無非預設傳乙個結構體指標的事情,問題是有沒有必要。 the gc 我覺得是理解物件導向語言中物件的記憶體布局應該就知道怎麼模擬了,子類的字段是父類在字段上超集,用指標強制轉換成子類或者父類訪問裡面的成員。 可以舉例 c ...

怎麼理解 C 語言是面向過程的語言,C 是物件導向的語言?

真正面向過程的語言是BASIC之類,C語言已經是物件導向的語言了,我目前從事物聯網軟體開發工作,主要程式語言是C,基本上是用物件導向的手法進行開發,沒什麼不同。而C 更複雜了,它既可以寫面向過程,也可以物件導向,還可以泛型手法,甚至函式式。 Surface 這兩天我明白了題主所說的問題,我說下我的理...

C結構體和其他物件導向的程式語言的類相比,優勢在哪?

一秊執著 結構體簡單高效,只關心資料結構,不像類複雜多變,還要考慮方法。而c 裡,結構體也可以有成員函式,就像是域公有的類一樣,而類的域預設是私有的。所以有時完全可以用struct而不是class. 可以精確描述記憶體排列 在通訊領域,就是說可以精確描述網路報文 所以,通訊產品都是C C 實現,用其...