C++的封裝、多態、繼承在C中的對應實現方式

C++的特點:封裝、多態、繼承


1.封裝是面向對象最重要的特徵之一(C++中的類class),封裝就是指隱藏。 

封裝的優點:(1)確保用戶代碼不會無意間破壞封裝對象的狀態;(外部程序不能隨便改變對象中的狀態)(2)被封裝的類的具體實現細節可以隨時改變,而無需調整用戶級別的代碼(底層的實現與上層的接口無關)

2.繼承是面向對象的又一重要特徵。繼承可以使用不同的類的對象具有相同的行爲;爲了使用其他類的方法,我們沒有必要重新編寫這些舊方法,只要這個類(子類)繼承包含的方法的類(父類)即可。 從下往上看,繼承可以重用父類的功能;從上往下看,繼承可以擴展父類的功能。


3、多態多態可以使我們以相同的方式處理不同類型的對象。我們可以使用一段代碼處理不同類型的對象,只要他們繼承/實現了相同的類型。這樣,我們沒有必要爲每一種類型的對象撰寫相同的邏輯,極大的提高了代碼的重用。 


C語言是一種面向過程的程序設計語言,而C++是在C語言基礎上衍生來了的面向對象的語言,實際上,很多C++實現的底層是用C語言實現的(http://www.ibm.com/developerworks/cn/linux/l-cn-cpolym/index.html?ca=drs-)

1.C語言中的封裝

在C語言中,可以用結構+函數指針來模擬類的實現,而用這種結構定義的變量就是對象。

封裝的主要含義是隱藏內部的行爲和信息,使用者只用看到對外提供的接口和公開的信息。有兩種方法實現封裝:

(1)    利用C語言語法。在頭文件中聲明,在C文件中真正定義它。(只將非static的函數和變量暴露出來)

(2)    把私有數據信息放在一個不透明的priv變量或者結構體中。只有類的實現代碼才知道priv或者結構體的真正定義。(外部無法直接修改struct中的變量)


2.C語言中的繼承

在C語言中,可以利用“結構在內存中的佈局與結構的聲明具有一致的順序”這一事實實現繼承。

struct Circle
{
const struct Point point; //放在第一位,可表繼承
int radius;
};

3.C語言中的多態

可以使用C語言中的萬能指針void* 實現多態


一,static和extern:

大工程下我們會碰到很多源文檔。
                
文檔a.c
static int i; //只在a文檔中用
int j;    //在工程裏用
static void init()         //只在a文檔中用
{
}
void callme()          //在工程中用
{
   static int sum;
}

上面的全局i變量和init()函數只能用在a.c文檔中,全局變量sum的作用域只在callme裏。變量j和函數callme()的全侷限擴充到整個工程文檔。所以能夠在下面的b.c中用extern關鍵字調用。extern告訴編譯器這個變量或函數在其他文檔裏已被定義了。
文檔b.c
extern int j;     //調用a文檔裏的
extern void callme();  //調用a文檔裏的
int main()
{
  ...
}

extern的另外用法是當C和C++混合編程時假如c++調用的是c源文檔定義的函數或變量,那麼要加extern來告訴編譯器用c方式命名函數:
文檔A.cpp調用a.c裏面的變量i和函數callme()
extern "C"  //在c++文檔裏調用c文檔中的變量
{
   int j;
   void callme();
}
int main()
{
   callme();
}

二,static法則:

    A、若全局變量僅在單個C文檔中訪問,則能夠將這個變量修改爲靜態全局變量,以降低模塊間的耦合度;
    B、若全局變量僅由單個函數訪問,則能夠將這個變量改爲該函數的靜態局部變量,以降低模塊間的耦合度;
    C、設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,需要考慮重入問題;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章