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()和兩個其它類實現相同的功能,但具有不同的算法來計算特定的形狀的麵積。
設計策略:
麵向對象的係統可能會使用一個抽象基類為所有的外部應用程序提供一個適當的,通用的,標準化的接口。然後,通過從抽象基類繼承,派生類形成,所有類似的工作。
通過外部應用程序提供的功能(即公共職能)提供作為抽象基類純虛函數。在對應於特定類型的應用程序的派生類中提供了這些純虛函數的實現。
這個架構也允許新的應用可以很容易地添加到係統,在係統被定義之後,即可使用。