C++深度解析 C++中的抽象類和接口 --- 純虛函數,虛函數(51)

C++深度解析 C++中的抽象類和接口 --- 純虛函數,虛函數(51)

 

 

 

抽象類(相當於圖形、動物、鳥類(抽象概念),沒有意義的。)

在現實中需要知道具體的圖形類型才能求面積,所以對概念上的“ 圖形 ”求面積是沒有意義的

 

 

 

面向對象中的抽象類

可用於表示現實世界中的抽象概念

是一種只能定義類型,而不能產生對象的類

只能被繼承重寫相關函數

直接特徵是相關函數沒有完整的實現

 

 

 

Shape是現實世界中各種圖形的抽象概念

因此:

程序中必須能夠反映抽象的圖形

程序中通過抽象類表示圖形的概念

抽象類不能創建對象,只能用於繼承

 

 

 

抽象類與純虛函數

C++語言中沒有抽象類的概念

C++中通過純虛函數實現抽象類

純虛函數是指只定義原型的成員函數

一個C++類中存在純虛函數就成爲了抽象類

 

 

 

純虛函數的語法規則

//抽象類,只能繼承,不能用來生成對象
class Shape
{
public:
    //純虛函數也是虛函數
    virtual double area() = 0;
};

純虛函數沒有函數實現,只有函數的聲明。

“= 0”用於告訴編譯器當前是聲明純虛函數,因此不需要定義函數體。

類圖:

代碼如下:(抽象類初探)

#include <iostream>
#include <string>

using namespace std;

//抽象類
class Shape
{
public:
    //純虛函數
    virtual double area() = 0;
};

class Rect : public Shape
{
    //長和寬
    int ma;
    int mb;
public:
    Rect(int a, int b)
    {
        ma = a;
        mb = b;
    }
    //重寫純虛函數
    double area()
    {
        return ma * mb;
    }
};

class Circle : public Shape
{
    int mr;
public:
    Circle(int r)
    {
        mr = r;
    }
    double area()
    {
        return 3.14 * mr * mr;
    }
};

//多態,同一行調用語句,不同的調用結果
//Shape是一個抽象類
void area(Shape* p)
{
    //指針p指向Shape的子類
    double r = p->area();
    
    cout << "r = " << r << endl;
}

int main()
{
    Rect rect(1, 2);
    Circle circle(10);
    
    area(&rect);
    area(&circle);
    
    return 0;
}

結果如下:

分析:

抽象類只能用作父類被繼承

子類必須實現純虛函數的具體功能

純虛函數被實現後成爲虛函數

如果子類沒有實現純虛函數,則子類成爲抽象類

 

 

 

特殊的抽象類----接口(一組行爲的規範)

類中沒有定義任何的成員變量

所有的成員函數都是公有的

所有的成員函數都是純虛函數

接口是一種特殊的抽象類

例子:

網絡編程,從網絡上收數據過來,進行處理,數據通過網絡發出去。(收和發的工作)

計算機的串口編程,數據從串口收上來,進行處理,數據通過串口發出去。(收和發的工作)

示例代碼:

#include <iostream>
#include <string>

using namespace std;

//接口,還是抽象類
class Channel
{
public:
    //純虛函數
    virtual bool open() = 0;
    virtual void close() = 0;
    virtual bool send(char* buf, int len) = 0;
    virtual int receive(char* buf, int len) = 0;
};

int main()
{
        
    return 0;
}

 

 

 

小結

抽象類用於描述現實世界中的抽象概念

抽象類只能被繼承不能創建對象

C++中沒有抽象類的概念

C++中通過純虛函數實現抽象類

類中只存在純虛函數的時成爲接口

接口是一種特殊的抽象類

 

 

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