1. 程式人生 > >30、不一樣的C++系列--抽象類和介面

30、不一樣的C++系列--抽象類和介面

抽象類和介面

抽象類

  • 面向物件中的抽象類

    • 可用於表示現實世界中的抽象概念
    • 是一種智慧定義型別,而不能產生物件的類
    • 只能被繼承並重寫相關函式
    • 直接特徵是相關函式沒有完整的實現
  • 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;
}