深度探索C++對(duì)象模型(3)

字號(hào):

介紹
     多態(tài)是一種威力強(qiáng)大的設(shè)計(jì)機(jī)制,允許你繼承一個(gè)抽象的public接口之后,封裝相關(guān)的類(lèi)型,需要付出的代價(jià)就是額外的間接性--不論是在內(nèi)存的獲得,或是在類(lèi)的決斷上,C++通過(guò)class的pointer和references來(lái)支持多態(tài),這種程序風(fēng)格就稱(chēng)為"面向?qū)ο?.
     大家好,雷神關(guān)于《深度探索C++對(duì)象模型》筆記終于又和大家見(jiàn)面了,速度慢的真是可以。好了不浪費(fèi)時(shí)間了,直接進(jìn)入主題。
     這篇筆記主要解決了幾個(gè)常常被人問(wèn)到的問(wèn)題。
     1、C++支持多重繼承嗎?
     2、結(jié)構(gòu)和類(lèi)的區(qū)別是什么?
     3、如何設(shè)計(jì)一個(gè)面向?qū)ο蟮哪P停?BR>     C++支持多重繼承(JAVA和C#不支持多重繼承),雖然我想我可能一輩子用不到它這一特性(C++是雷神的業(yè)余愛(ài)好),但至少我要知道它可以。典型的多重繼承是下面這個(gè):
    //iostream 從istream 和 ostream 兩個(gè)類(lèi)繼承。
    class iostream:public istream,public ostream
    {......};
     結(jié)構(gòu)struct和類(lèi)class到底有沒(méi)有區(qū)別?VCHELP上前幾天還看到一個(gè)帖子在討論這個(gè)問(wèn)題。其實(shí)結(jié)構(gòu)和類(lèi)真的沒(méi)什么區(qū)別,不過(guò)我們需要掌握的是什么時(shí)候用結(jié)構(gòu)好,什么時(shí)候用類(lèi)好,當(dāng)然這沒(méi)有嚴(yán)格的規(guī)定。通常我們混合使用它們,從書(shū)上的例子,我們可以看出為什么還需要保留結(jié)構(gòu),并且書(shū)上給出了一個(gè)方法:
    struct C_point{.......}; //這是一個(gè)結(jié)構(gòu)
    class Point
    {
    public:
    operator C_point(){return _c_point;}
    //....
    private:
    C_point _c_point;
    //....
    }
     這種方法被成為組合(composition).它將一個(gè)對(duì)象模型的全部或部分用結(jié)構(gòu)封裝起來(lái),這樣做的好處是你既可以在C++中應(yīng)用這個(gè)對(duì)象模型,也可以在C中應(yīng)用它。因?yàn)閟truct封裝了class的數(shù)據(jù),使C++和C都能有合適的空間布局。
     面向?qū)ο竽P褪怯幸恍┍舜讼嚓P(guān)的類(lèi)型,通過(guò)一個(gè)抽象的base class(用來(lái)提供接口),被封裝起來(lái)。真正的子類(lèi)都是通過(guò)它派生的。當(dāng)然一個(gè)設(shè)計(jì)優(yōu)秀的對(duì)象模型還必須考慮很多的細(xì)節(jié)問(wèn)題,雷神根據(jù)自己的理解寫(xiě)出一個(gè)面向?qū)ο竽P偷拇a,大家可以看看,高手請(qǐng)給指出有沒(méi)有問(wèn)題。雷神先謝了。
     思路:我想要實(shí)現(xiàn)一個(gè)人員管理管理的對(duì)象模型,雷神一直在思考一個(gè)人員管理的組件(當(dāng)然最終它會(huì)用C#實(shí)現(xiàn)的一個(gè)業(yè)務(wù)邏輯對(duì)象,并通過(guò)數(shù)據(jù)庫(kù)控制對(duì)象和數(shù)據(jù)庫(kù)進(jìn)行交互,通過(guò)WEB form來(lái)顯示界面)。這里借用一下自己的已經(jīng)有的的想法,用C++先進(jìn)行一下實(shí)驗(yàn),由于只是為了體會(huì)面向?qū)ο蟮母拍?,我們采用面向?qū)ο蟮姆椒▽?shí)現(xiàn)一個(gè)鏈表程序,而且沒(méi)有收集信息的接口。信息從mina()函數(shù)顯式給出。
     這個(gè)對(duì)象模型應(yīng)該可以實(shí)現(xiàn)對(duì)人員的一般性管理,要求具備以下功能:
     創(chuàng)建一個(gè)人員信息鏈表
     添加、刪除人員信息
     顯示人員信息
    //*************************************************
    //PersonnelManage.cpp
    //創(chuàng)建人:雷神
    //日期:2002-8-30
    //版本:
    //描述:
    //*************************************************
    #include
    #include
    //基類(lèi),是此對(duì)象模型的最上層父類(lèi)
    class Personnel
    {
    friend class point_list; //用來(lái)實(shí)現(xiàn)輸出鏈表,以及插入或刪除人員的功能.
    protected:
    char serial_number[15];//編號(hào)
    char name[10];//名稱(chēng)
    char password[15]//口令
    Personnel *pointer;
    Personnel *next_link;
    public:
    Personnel(char *sn,char *nm,char *pwd)
    {
    strcpy(serial_number,sn);
    strcpy(name,sm);
    strcpy(password,pwd);
    next_link=0;
    }
    Personnel()
    {
    serial_number[0]=NULL;
    name[0]=NULL;
    password[0]=NULL;
    next_link=0;
    }
    void fill_serial_number(char *p_n)
    {
    strcpy(serial_number,p_n);
    }
    void fill_name(char *p_nm)
    {
    strcpy(name,p_nm);
    }
    void fill_password(char *p_pwd)
    {
    strcpy(password,p_pwd);
    }
    virtual void addnew(){}
    virtual void display()
    {
    cout<<"\n編號(hào):"< cout<<"名字:"< cout<<"口令:"< }
    };
    //下面是派生的子類(lèi),為了簡(jiǎn)單些我在把子類(lèi)進(jìn)行了成員簡(jiǎn)化。
    //思路:由父類(lèi)派生出成員子類(lèi),正式成員要求更詳細(xì)的個(gè)人資料,這里省略了大部份.