接口可以用來描述一個 C++ 類的行為或功能,但是并不需要對這個類進行實現(xiàn)。
C++ 接口是通過抽象類來實現(xiàn)的,這些抽象類不應(yīng)與數(shù)據(jù)抽象混淆,數(shù)據(jù)抽象的概念:概念結(jié)構(gòu)是對現(xiàn)實世界的一種抽象,從實際的人、物、事和概念中抽取所關(guān)心的共同特性,忽略非本質(zhì)的細節(jié),把這些特性用各種概念精確地加以描述,這些概念組成了某種模型。
一個抽象類的聲明里至少要有一個函數(shù)作為純虛函數(shù)。在函數(shù)形參表后面寫上 “= 0” 以指定純虛函數(shù):
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) 的目的是提供一個適當?shù)牟⑶移渌惪梢岳^承的基類。抽象類不能實例化對象并且只能作為一個接口使用。試圖實例化一個抽象類的對象會導致編譯錯誤。
因此,如果一個抽象類的子類的需要實例化,它必須實現(xiàn)所有的虛函數(shù),這意味著它支持抽象類的接口聲明。如果在派生類中未能覆蓋一個純虛函數(shù),然后試圖實例化該類的對象,會導致一個編譯錯誤。
可用于實例化對象的類被稱為具體類。
考慮下面的例子,父類為基類提供了一個接口來實現(xiàn)函數(shù) 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;
}
上面的代碼編譯和執(zhí)行后,將產(chǎn)生以下結(jié)果:
Total Rectangle area: 35
Total Triangle area: 17
一個面向?qū)ο蟮南到y(tǒng)可能使用一個抽象基類提供一個普遍的和適合所有的外部應(yīng)用程序的標準化接口。然后, 通過繼承的抽象基類, 形成派生類。
功能(即,公共函數(shù)),即由外部應(yīng)用程序提供的,作為抽象基類里面的純虛函數(shù)。 那些純虛函數(shù)是由派生類實現(xiàn)的,派生類對應(yīng)于應(yīng)用的特定類型。
即使在系統(tǒng)已經(jīng)定義之后, 這種架構(gòu)還允許添加新的應(yīng)用程序到系統(tǒng)中。