二級(jí)C++多態(tài)性:抽象類和純虛函數(shù)

字號(hào):

1、 純虛函數(shù):
    純虛函數(shù)是一種特殊的虛函數(shù),它的一般格式如下:
    class< 類名 >
    {
    virtual < 類型 >< 函數(shù)名 >(< 參數(shù)表 >)=0;
    ……
    };
    一般情況下可將一個(gè)成員函數(shù)在基類中聲明為純虛函數(shù),其實(shí)現(xiàn)在派生類中完成。
    例:一個(gè)使用純虛函數(shù)的例子:
    #include
    class phoneCard
    {
    public:
    virtual bool performDial()=0;
    double getBalance()
    {
    return balance;
    }
    phoneCard(double ba)
    {
    balance=ba;
    }
    protected:
    double balance;
    };
    class none_phoneCard:public phoneCard
    {
    public:
    char *getSetType()
    {
    return phoneSetType;
    }
    protected:
    char phoneSetType[20];
    };
    class number_phoneCard:public phoneCard
    {
    public:
    bool performConnection(long cn,int pw)
    {
    if(cn==cardNumber&&pw==password)
    {
    connected=true;
    return true;
    }
    else
    return false;
    }
    number_phoneCard(long ca,int pa,char *per,
    bool co,double ba):phoneCard(ba)
    {
    cardNumber=ca;
    password=pa;
    connectNumber=per;
    connected=co;
    }
    protected:
    long cardNumber;
    int password;
    char* connectNumber;
    bool connected;
    };
    class magCard:public none_phoneCard
    {
    public:
    char usefulArea;
    bool performDial()
    {
    if(balance>0.9)
    {
    balance-=0.9;
    return true;
    }
    else
    return false;
    }
    };
    class IC_card: public none_phoneCard
    {
    public:
    bool performDial()
    {
    if(balance>0.5)
    {
    balance-=0.5;
    return true;
    }
    else
    return false;
    }
    };
    class IP_card:public number_phoneCard
    {
    public:
    char expireDate[20];
    bool performDial()
    {
    if(balance>0.3&&expireDate>"20011220")
    {
    balance-=0.3;
    return true;
    }
    else
    return false;
    }
    };
    class D200_card :public number_phoneCard
    {
    public:
    double additoryFee;
    bool performDial()
    {
    if(balance>(0.5+additoryFee))
    {
    balance-=(0.5+additoryFee);
    }
    else
    return false;
    }
    D200_card(double add=0,long ca=0,int pa=0,
    char *con="00000000",bool connected=false,
    double ba=0):number_phoneCard(ca,pa,con,connected,ba)
    {
    additoryFee=add;
    }
    };
    void main()
    {
    D200_card obj1(0,163,1234567,"163",false,50);
    cout<
    obj1.performDial();
    cout<
    }
    運(yùn)行結(jié)果:
    50
    49.5
    學(xué)員可自行分析一下該程序中的類之間的繼承關(guān)系。
    2、抽象類:
    抽象類是一種特殊的類,它是為了抽象和設(shè)計(jì)的目的為建立的,它處于繼承層次結(jié)構(gòu)的較上層。
    ⑴抽象類的定義:
    稱帶有純虛函數(shù)的類為抽象類。
    ⑵抽象類的作用:
    抽象類的主要作用是將有關(guān)的操作作為結(jié)果接口組織在一個(gè)繼承層次結(jié)構(gòu)中,由它來(lái)為派生類提供一個(gè)公共的根,派生類將具體實(shí)現(xiàn)在其基類中作為接口的操作。所以派生類實(shí)際上刻畫了一組子類的操作接口的通用語(yǔ)義,這些語(yǔ)義也傳給子類,子類可以具體實(shí)現(xiàn)這些語(yǔ)義,也可以再將這些語(yǔ)義傳給自己的子類。
    (3)使用抽象類時(shí)注意:
    • 抽象類只能作為基類來(lái)使用,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。如果派生類中沒(méi)有重新定義純虛函數(shù),而只是繼承基類的純虛函數(shù),則這個(gè)派生類仍然還是一個(gè)抽象類。如果派生類中給出了基類純虛函數(shù)的實(shí)現(xiàn),則該派生類就不再是抽象類了,它是一個(gè)可以建立對(duì)象的具體的類。
    • 抽象類是不能定義對(duì)象的。
    如上例中, phoneCard,none_phoneCard,number_phoneCard 等就是抽象類,不能為其建立對(duì)象。而 magCard,IC_card,IP_card,D200_card 等實(shí)現(xiàn)了純虛函數(shù) performDial() ,從而是具體的類,可以建立對(duì)象。