如何在 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; class Shape { // Base class 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; }; class Rectangle: public Shape { // Derived classes 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() 定義介面,以及其他兩個類如何實現相同的函式,但使用不同的演算法來計算特定形狀的面積。
設計策略
面向物件系統可以使用抽象基類來提供適用於所有外部應用程式的通用且標準化的介面。然後,透過從該抽象基類繼承,形成操作方式類似的派生類。
外部應用程式提供的功能(即公共函式)在抽象基類中作為純虛擬函式提供。這些純虛擬函式的實現是在對應於應用程式特定型別的派生類中提供的。
這種架構還允許輕鬆地將新應用程式新增到系統中,即使在系統已定義之後也是如此。
廣告