C++ 介面(抽象類)



介面描述了 C++ 類的行為或功能,而無需承諾該類的特定實現。

C++ 介面使用抽象類實現,這些抽象類不應與資料抽象混淆,資料抽象是將實現細節與相關資料分離開來的概念。

透過將至少一個函式宣告為純虛擬函式,可以使類成為抽象類。純虛擬函式透過在其宣告中放置“= 0”來指定,如下所示:

class Box {
   public:
      // pure virtual function
      virtual double getVolume() = 0;
      
   private:
      double length;      // Length of a box
      double breadth;     // Breadth of a box
      double height;      // Height of a box
};

抽象類(通常稱為 ABC)的目的是提供一個合適的基類,其他類可以從中繼承。抽象類不能用於例項化物件,僅作為介面。嘗試例項化抽象類的物件會導致編譯錯誤。

因此,如果 ABC 的子類需要被例項化,它必須實現每個虛擬函式,這意味著它支援由 ABC 宣告的介面。如果在派生類中沒有覆蓋純虛擬函式,則嘗試例項化該類的物件將導致編譯錯誤。

可以用來例項化物件的類稱為具體類

抽象類示例

考慮以下示例,其中父類為基類提供了一個介面來實現一個名為getArea()的函式:

#include <iostream>
 
using namespace std;
 
// Base class
class Shape {
   public:
      // pure virtual function providing interface framework.
      virtual int getArea() = 0;
      void setWidth(int w) {
         width = w;
      }
   
      void setHeight(int h) {
         height = h;
      }
   
   protected:
      int width;
      int height;
};
 
// Derived classes
class Rectangle: public Shape {
   public:
      int getArea() { 
         return (width * height); 
      }
};

class Triangle: public Shape {
   public:
      int getArea() { 
         return (width * height)/2; 
      }
};
 
int main(void) {
   Rectangle Rect;
   Triangle  Tri;
 
   Rect.setWidth(5);
   Rect.setHeight(7);
   
   // Print the area of the object.
   cout << "Total Rectangle area: " << Rect.getArea() << endl;

   Tri.setWidth(5);
   Tri.setHeight(7);
   
   // Print the area of the object.
   cout << "Total Triangle area: " << Tri.getArea() << endl; 

   return 0;
}

編譯並執行上述程式碼時,將產生以下結果:

Total Rectangle area: 35
Total Triangle area: 17

您可以看到抽象類如何根據 getArea() 定義介面,以及另外兩個類如何實現相同的函式,但使用不同的演算法來計算特定形狀的面積。

設計策略

面向物件的系統可能會使用抽象基類來提供適用於所有外部應用程式的通用且標準化的介面。然後,透過從該抽象基類繼承,形成操作類似的派生類。

外部應用程式提供的功能(即公共函式)在抽象基類中以純虛擬函式的形式提供。這些純虛擬函式的實現是在對應於應用程式特定型別的派生類中提供的。

這種架構還允許輕鬆地將新應用程式新增到系統中,即使在系統已定義之後也是如此。

廣告