Object Oriented C (OOC) ,中文譯名為面向對象的C語言,是一種程式設計思想,指的是用C語言實現類似C++語言的面向對象特性。
基本介紹
- 中文名:面向對象的C語言
- 外文名:Object Oriented C
- 簡稱:OOC
- 定義:是一種程式設計思想
OOC的由來
封裝
//SimClass.htypedefstructSimClass//模擬類(Class){intm_maxlen;//模擬成員變數(MemberVariable)char*m_info;}SimClass;voidCSimClass(SimClass*sc,intmaxlen);//模擬構造函式(Constructor)voidDSimClass(SimClass*sc);//模擬析構函式(Destructor)intSimClass_Save(SimClass*sc,constchar*info);//模擬成員函式(MemberFunction)intSimClass_Load(SimClass*sc,char**info);
//SimClass.c(注意而非.cpp)voidCSimClass(SimClass*sc,intmaxlen){sc->m_maxlen=maxlen;sc->m_info=(char*)malloc(sizeof(char)*maxlen);//開闢一段空間}voidDSimClass(SimClass*sc){free(sc->info);//釋放一段空間}intSimClass_Save(SimClass*sc,constchar*info){if(sc->maxlen<strlen(info))return-1;//信息太長strcpy(sc->m_info,info);return0;//成功}intSimClass_Load(SimClass*sc,char**info){*info=sc->m_info;return0;//成功}
SimClass_
SimClass*sc
#include"SimClass.h"intmain(){SimClassSCA,SCB;//...定義CSimClass(&SCA);//由於我們是在模擬C++,所以需要顯式地構造CSimClass(&SCB);SimClass_Save(&SCA,"這個字元串保存到A");//存SimClass_Save(&SCB,"這個字元串保存到B");//存char*buf;SimClass_Load(&SCA,&buf);//取printf("%s",buf);//這樣就可以列印出先前存的內容DSimClass(&SCA);//也需要顯式地析構DSimClass(&SCB);return0;}
繼承
//Base.htypedefstructBase//模擬類Base{intm_val;//模擬成員}Base;intBase_Fun(Base*bs);//模擬成員
//Derive.h#defineDERIVE#include"Base.h"//引用基類BasetypedefstructDerive//模擬類Derive{DERIVEBasem_base;//繼承成員intm_val;//模擬成員,成員可以同名}Derive;intDerive_Fun(Derive*dv);//模擬成員
//Base.c#include"Base.h"intBase_Fun(Base*bs){printf("Basefunoutput:myvalis%d\n",bs->m_val);//輸出基類數值return0;}
//Derive.c#include"Derive.h"//這個宏稱為繼承描述表,每個表項是一個相應繼承層的結構體的引用。因為我們是自己實現繼承,所以需要這樣顯式地指明所有繼承關係。可以三重或者多重繼承,有幾重繼承這裡就需要有多少個表項。#defineDERIVE_BASE(dv->m_base)intDerive_Fun(Derive*dv){printf("Deverifunoutput:myvalis%d\n",dv->m_val);//輸出子類數值printf("TheBasefunoutput:thebasehisvalis%d\n",DERIVE_BASE.m_val);//子類也可以輸出基類的數值。子類要找基類的成員變數怎么找呢?就是通過上面定義的繼承描述表來找。return0;}
#include"Derive.h"intmain(){Derivedv;Derive_Fun(&dv);//這樣就可以了,子類要輸出基類的成員變數的話,它會自己去找基類。return0;}
多態
#include"Base.h"//由於用到了多態,這裡子類的所有基類的頭檔案都要顯式地添加。如果只需要繼承的話是不用這樣的。#include"Derive.h"//動態繼承描述表宏,帶一個變數用於(內聯地)傳遞對象。#defineDERIVE_BASE(DV)(DV.m_base)intmain(){Derivedv;Derive_Fun(&dv);//這樣我們可以訪問子類的Fun函式Base_Fun(&DERIVE_BASE(dv));//這樣我們可以訪問這個子類所繼承的基類的Fun函式return0;}