C++接口(抽象类)
接口是一种规范。按照接口规范进行方法调用,就能获得所期望的功能,按照接口规范实现接口的的方法,就能提供所期望的功能。
接口描述了类的行为和功能,而不需要完成类的特定实现。
C++ 使用 抽象类 来实现接口。
抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。
抽象类
如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。
纯虚函数是通过在声明中使用 = 0
来指定的
如下所示:
class Box { public: // 纯虚函数 virtual double getVolume() = 0; private: double length; // 长度 double breadth; // 宽度 double height; // 高度 };
抽象类 (通常称为 ABC
)的目的,是为了给其他类提供一个可以继承的适当的基类。
抽象类不能被用于范例化对象,它只能作为 接口 使用。 如果试图范例化一个抽象类的对象,会导致编译错误。
因此,如果一个 ABC 的子类需要被范例化,则必须实现每个虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重载纯虚函数,就尝试范例化该类的对象,会导致编译错误。
可用于范例化对象的类被称为 具体类
范例 : 抽象类范例
下面的范例,基类 Shape 提供了一个接口 getArea()
,然后在两个派生类 Rectangle
和 Triangle
分别实现 getArea()
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> using namespace std; // 基类 class Shape { public: // 提供接口框架的纯虚函数 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 { 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(6); Rect.setHeight(8); // 输出对象的面积 cout << "Total Rectangle area is : " << Rect.getArea() << endl; Tri.setWidth(6); Tri.setHeight(8); // 输出对象的面积 cout << "Total Triangle area is : " << Tri.getArea() << endl; return 0; }
编译运行范例,输出结果如下
$ g++ main.cpp && ./a.out Total Rectangle area is : 48 Total Triangle area is : 24
上面的范例,我们可以学到一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数
最佳实战
-
设计面向对象的系统时可以使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。
-
外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。
这种构架使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。