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()定义了接口,而两个其他类则以不同的算法实现了相同的功能来计算特定形状的面积。
设计策略
面向对象的系统可以使用一个抽象基类来提供适用于所有外部应用程序的共同和标准化的接口。然后,通过从该抽象基类继承,形成操作类似的派生类。
外部应用程序提供的功能(即公共函数)在抽象基类中作为纯虚函数提供。这些纯虚函数的实现位于与应用程序的具体类型相对应的派生类中。
这种架构还允许在系统已定义后轻松添加新的应用程序。