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;
};

接口是一種特殊的抽象類,所以抽象類具有隻能被繼承不能創建對象的特徵它也具備。

轉載自:https://blog.csdn.net/qq_29344757/article/details/77346934

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章