1. 程式人生 > >C++筆記 第五十二課 C++中的抽象類和介面---狄泰學院

C++筆記 第五十二課 C++中的抽象類和介面---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux

第五十二課 C++中的抽象類和介面

1.什麼是抽象類?

面向物件中的抽象概念
在進行面向物件分析時,會發現一些抽象的概念!圖形的面積如何計算?
在這裡插入圖片描述
在現實中需要知道具體的圖形型別才能求面積,所以對概念上的“圖形”求面積是沒有意義的!
在這裡插入圖片描述
Shape只是一個概念上的型別,沒有具體物件!

2.問題

Shape類有必要存在嗎?

3.什麼是抽象類?

面向物件中的抽象類
可用於表示現實世界中的抽象概念
是一種只能定義型別,而不能產生物件的類
只能被繼承並重寫相關函式
直接特徵是關於函式沒有完整的實現

4.面向物件中的抽象類

Shape是現實世界中各種圖形的抽象概念
因此
程式中必須能夠反映抽象的圖形
程式中通過抽象類表示圖形的概念
抽象類不能建立物件,只能用於繼承

5.抽象類與純虛擬函式

C++語言中沒有抽象類的概念
C++中通過純虛擬函式實現抽象類
純虛擬函式是指只定義原型的成員函式
一個C++類中存在純虛擬函式就成為了抽象類
純虛擬函式的語法規則
在這裡插入圖片描述
“=0”用於告訴編譯器當前是宣告純虛擬函式,因此不需要定義函式體。

52-1 抽象類初探(**)—認真理解

#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;
    }
};
void area(Shape* p)
{
    double r = p->area();
    cout << "r = " << r << endl;
}
int main()
{
    Rect rect(1,2);
    Circle circle(10);   
    area(&rect);
    area(&circle);
    return 0;
}
執行結果:
r = 2
r = 314

程式分析:
同一條呼叫語句,不同的呼叫結果,顯示了多型的特性,抽象類不能夠定義特別的物件,但是可以定義抽象的指標,對應的指標指向抽象類的子類,抽象類的子類肯定會把純虛擬函式實現,因此通過抽象類的指標來呼叫純虛擬函式的語句是可以編譯通過,沒有問題的。
得到的結論:
抽象類智慧用作父類被繼承
子類必須實現純虛擬函式的具體功能
純虛擬函式被實現後成為虛擬函式
如果子類沒有實現純虛擬函式,則子類成為抽象類
滿足下面條件的C++類則成為介面—三個條件
類中沒有定義任何的成員變數
所有的成員函式都是公有的
所有的成員函式都是純虛擬函式
介面是一種特殊的抽象類

52-2 介面初探

#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++中通過純虛擬函式實現抽象類
類中只存在純虛擬函式時成為介面
介面是一種特殊的抽象類