一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

OO in C(1): C語言中的類模擬和多態(tài),繼承

 xiadz 2005-08-08
    在面向?qū)ο蟮恼Z言里面,出現(xiàn)了類的概念。這是編程思想的一種進(jìn)化。所謂類:是對特定數(shù)據(jù)的特定操作的集合體。所以說類包含了兩個范疇:數(shù)據(jù)和操作。而C語言中的struct僅僅是數(shù)據(jù)的集合。

1.實例:下面先從一個小例子看起

#ifndef C_Class
    #define C_Class struct
#endif

C_Class A {
    C_Class A *A_this;
    void (*Foo)(C_Class A *A_this);
    int a;
    int b;
};

C_Class B{           //B繼承了A
    C_Class B *B_this; //順序很重要
    void (*Foo)(C_Class B *Bthis);         //虛函數(shù)
    int a;
    int b;

    int c;
};


void B_F2(C_Class B *Bthis)
{
    printf("It is B_Fun\n");
}

void A_Foo(C_Class A *Athis)
{
    printf("It is A.a=%d\n",Athis->a);//或者這里
//   exit(1);
//   printf("純虛 不允許執(zhí)行\(zhòng)n");//或者這里
}

void B_Foo(C_Class B *Bthis)
{
    printf("It is B.c=%d\n",Bthis->c);
}

void A_Creat(struct A* p)
{
    p->Foo=A_Foo;
    p->a=1;
    p->b=2;
    p->A_this=p;
}


void B_Creat(struct B* p)
{
    p->Foo=B_Foo;
    p->a=11;
    p->b=12;    
    p->c=13;
    p->B_this=p;
}


int main(int argc, char* argv[])
{
    C_Class A *ma,a;
    C_Class B *mb,b;

    A_Creat(&a);//實例化
    B_Creat(&b);

    mb=&b;
    ma=&a;

    ma=(C_Class A*)mb;//引入多態(tài)指針
    printf("%d\n",ma->a);//可惜的就是 函數(shù)變量沒有private
    ma->Foo(ma);//多態(tài)
    a.Foo(&a);//不是多態(tài)了
    B_F2(&b);//成員函數(shù),因為效率問題不使用函數(shù)指針
    return 0;
}
輸出結(jié)果:
11
It is B.c=13
It is A.a=1
It is B_Fun

2.類模擬解說:
    我在網(wǎng)上看見過一篇文章講述了類似的思想(據(jù)說C++編程思想上有更加詳細(xì)的解說,可惜我沒空看這個了,如果有知道的人說一說吧)。但是就象C++之父說的:“C++和C是兩種語言”。所以不要被他們在語法上的類似就混淆使用,那樣有可能會導(dǎo)致一些不可預(yù)料的事情發(fā)生。
    其實我很同意這樣的觀點,本文的目的也不是想用C模擬C++,用一個語言去模擬另外一個語言是完全沒有意義的。我的目的是想解決C語言中,整體框架結(jié)構(gòu)過于分散、以及數(shù)據(jù)和函數(shù)脫節(jié)的問題。
    C語言的一大問題是結(jié)構(gòu)松散,雖然現(xiàn)在好的大型程序都基本上按照一個功能一個文件的設(shè)計方式,但是無法做到更小的顆?;D―原因就在于它的數(shù)據(jù)和函數(shù)的脫節(jié)。類和普通的函數(shù)集合的最大區(qū)別就在于這里。類可以實例化,這樣相同的函數(shù)就可以對應(yīng)不同的實例化類的變量。
    自然語言的一個特點是概括:比如說表??梢哉f手表,鐘表,秒表等等,這樣的描述用面向?qū)ο蟮恼Z言可以說是抽象(繼承和多態(tài))。但是我們更要注意到,即使對應(yīng)于手表這個種類,還是有表鏈的長度,表盤的顏色等等細(xì)節(jié)屬性,這樣細(xì)微的屬性如果還用抽象,就無法避免類膨脹的問題。所以說類用成員變量來描述這樣的屬性。這樣實例并初始化不同的類,就描述了不同屬性的對象。
    但是在C語言中,這樣做是不可能的(至少語言本身不提供這樣的功能)。C語言中,如果各個函數(shù)要共享一個變量,必須使用全局變量(一個文件內(nèi))。但是全局變量不能再次實例化了。所以通常的辦法是定義一個數(shù)組。以往C語言在處理這樣的問題的時候通常的辦法就是這樣,比如說socket的號,handel等等其實都是數(shù)組的下標(biāo)。(不同的連接對應(yīng)不同的號,不同的窗口對應(yīng)不同的handel,其實這和不同的類有不同的成員變量是一個意思)
    個人認(rèn)為:兩種形式(數(shù)組和模擬類)并無本質(zhì)的區(qū)別(如果不考慮虛函數(shù)的應(yīng)用的話),它們的唯一區(qū)別是:數(shù)組的辦法將空間申請放在了“模塊”內(nèi),而類模擬的辦法將空間申請留給了外部,可以說就這一點上,類模擬更加靈活。

3.其他的話:
    我的上述思想還是很不成熟的,我的目的是想讓C語言編程者能夠享受面向?qū)ο缶幊痰母鄻啡ぁN覀儍H僅面對的是浩瀚的“黑箱”,我們的工作是堆砌代碼,而且如果要更改代碼功能的時候,僅僅換一個黑箱就可以了。
    而更大的目的是促使這樣的黑箱的產(chǎn)生?;蛟S有一天,一種效率很好,結(jié)構(gòu)很好的語言將會出現(xiàn)。那個時候編程是不是就會象說話一樣容易了呢?

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲一区二区精品免费| 国产成人精品在线一区二区三区| 久久老熟女一区二区三区福利| 欧美成人免费一级特黄| 色一情一乱一区二区三区码| 国产日韩精品激情在线观看| 国产一区二区三区香蕉av| 亚洲精品有码中文字幕在线观看| 加勒比东京热拍拍一区二区| 国产免费无遮挡精品视频| 国产成人精品在线一区二区三区| 中文字幕高清不卡一区| 久草热视频这里只有精品| 九九久久精品久久久精品| 国产成人精品一区二区在线看| 久久这里只精品免费福利| 欧美日韩中黄片免费看| 在线观看免费视频你懂的| 国产成人在线一区二区三区| 欧美精品一区二区三区白虎| 国产精品自拍杆香蕉视频| 国产精品一区二区视频| 91精品国产品国语在线不卡| 在线视频免费看你懂的| 午夜资源在线观看免费高清| 亚洲视频一区二区久久久| 国产精品久久精品毛片| 91在线国内在线中文字幕| 日本人妻免费一区二区三区| 麻豆在线观看一区二区| 麻豆tv传媒在线观看| 中文字幕乱码免费人妻av| 日本黄色高清视频久久| 中文字幕亚洲人妻在线视频| 中文字幕一区二区熟女| 国产又粗又硬又大又爽的视频| 日韩黄色一级片免费收看| 日本欧美三级中文字幕| 国产三级欧美三级日韩三级| 国产欧美日韩精品自拍| 日本欧美一区二区三区在线播|