30、不一樣的C++系列--抽象類和介面
阿新 • • 發佈:2019-01-26
抽象類和介面
抽象類
面向物件中的抽象類
- 可用於表示現實世界中的抽象概念
- 是一種智慧定義型別,而不能產生物件的類
- 只能被繼承並重寫相關函式
- 直接特徵是相關函式沒有完整的實現
Shape是現實世界中各種圖形的抽象概念
- 因此:
- 程式中必須能夠反映抽象的圖形
- 程式中通過抽象類表示圖形的概念
- 抽象類不能建立物件,只能用於繼承
純虛擬函式
- C++語言中沒有抽象類的概念
- C++中通過純虛擬函式實現抽象類
- 純虛擬函式是指只定義原型的成員函式
- 一個C++類中存在純虛擬函式就成為了抽象類
- 純虛擬函式的語法規則:
class Shape
{
public:
virtual double area() = 0;
};
這裡 = 0
用於告訴編譯器當前是宣告純虛擬函式,因此不需要定義函式體。
舉一個例子:
#include <iostream>
#include <string>
using namespace std;
//抽象類 Shape
class Shape
{
public:
//宣告一個純虛擬函式
virtual double area() = 0;
};
//繼承Shape抽象類
class Rect : public Shape
{
int ma;
int mb;
public:
Rect(int a, int b)
{
ma = a;
mb = b;
}
//實現父類的純虛擬函式
//然後成為虛擬函式
double area()
{
return ma * mb;
}
};
//繼承Shape抽象類
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()
{
//定義2個子類
Rect rect(1, 2);
Circle circle(10);
//傳遞子類物件,使用多型特性
area(&rect);
area(&circle);
return 0;
}
輸出結果為:
r = 2
r = 314
這裡的Shape抽象類只能用作父類被繼承,子類必須實現純虛擬函式的具體功能。子類中實現了父類的純虛擬函式後成為虛擬函式。如果子類沒有實現純虛擬函式,則子類成為抽象類。
介面
- 滿足下面條件的C++類則成為介面
- 類中沒有定義任何的成員變數
- 所有的成員函式都是公有的
- 所有的成員函式都是純虛擬函式
- 介面是一種特殊的抽象類
舉個例子:
#include <iostream>
#include <string>
using namespace std;
//定義介面Channel
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;
}