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++中通過純虛函數實現抽象類
類中只存在純虛函數的時成爲接口
接口是一種特殊的抽象類