接口描述,类的行为或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()和两个其它类实现相同的功能,但具有不同的算法来计算特定的形状的面积。
设计策略:
面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的,通用的,标准化的接口。然后,通过从抽象基类继承,派生类形成,所有类似的工作。
通过外部应用程序提供的功能(即公共职能)提供作为抽象基类纯虚函数。在对应于特定类型的应用程序的派生类中提供了这些纯虚函数的实现。
这个架构也允许新的应用可以很容易地添加到系统,在系统被定义之后,即可使用。