1. 程式人生 > >c++中抽象類和介面

c++中抽象類和介面

1. 抽象類

 在面向物件程式設計中,抽象類是一種只能定義型別,不能生成物件的類,它是對一系列看上去不同,但是本質相同的具體概念的抽象。最典型的的抽象類就是”圖形”,三角形、矩形、梯形都是圖形,它們都具有邊長、面積屬性,”圖形”類是對這系列的抽象。

 程式設計中,我們可以定義一個表徵圖形的類,然後具體圖形繼承該類。圖形類,即基類定義如下:

class Shape
{
public:
    double area()  //求面積
    {
        //如何求??
    }
};

 實際上,只要是具體圖形就有面積這個量,但是對”圖形”求面積是沒有任何意義的,只有在知道具體的圖形型別之後才能求面積。所以對”圖形”來說,area()函式無法實現,且不可讓Shape生成物件(生成物件無意義),這就需要把Shape定義成一個抽象類:把area()函式宣告為純虛擬函式即可:

virtual double area() = 0;

 總結什麼是抽象類:其實,在c++中並沒有抽象類的概念,要實現抽象類則需要通過純虛擬函式實現。純虛擬函式指的是隻定義函式原型的成員函式。在c++的類中,只要存在純虛擬函式,那麼該類就變成抽象類。

 (1) 每個具體圖形的求面積演算法不一樣,所以加上virtual關鍵字,表明該函式是虛擬函式,在子類中重寫時可以發生多型;
 (2) 為對Shape類求面積無意義,所以加上”= 0”表明該函式宣告為純虛擬函式,不需要定義函式體。
 (3) 抽象類不能生成物件,只能用作父類被繼承,子類必須實現純虛擬函式的具體功能,在子類中,父類的純虛擬函式被實現後就變成虛擬函式,當然,如果子類沒有實現父類的純虛擬函式,那麼子類也是抽象類一個。

class shape
{
public:
    //純虛擬函式
    virtual double area() = 0;

};

//定義圓形類
class circle : public shape
{
private:
    int r;

public:
    circle(int a) : r(a)
    {}

    double area()
    {
        return r * r * 3.14;
    }
};

//定義矩形類
class rectangle : public shape
{
private:
    int x;
    int y;

public
: rectangle(int a, int b) : x(a), y(b) {} double area() { return x * y; } }; int main(void) { rectangle r(5, 6); circle c(5); printf("圓形面積為: %.2lf\n", c.area()); printf("矩形面積為: %.2lf\n", r.area()); return 0; }

 編譯執行:
這裡寫圖片描述

2. 介面

 理解了什麼是抽象類後(類中含有純虛擬函式),理解什麼是介面就簡單了。c++中介面也是一種特殊的類,需要滿足:
 (1) 類中沒有定義任何成員變數
 (2) 類中所有成員函式都是公有且都是純虛擬函式

舉例:

class deviceOp
{
public:
    virtual bool OpenDev() = 0;
    virtual void CloseDev() = 0;
    virtual bool WriteDev(const char* buf, int len) = 0;
    virtual int ReadDev(char* buf, int len) = 0;
};

 介面是一種特殊的抽象類,所以抽象類具有隻能被繼承不能建立物件的特徵它也具備。