知识分享: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():
实例
#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(5); Rect.setHeight(7);
// 输出对象的面积 cout << "Total Rectangle area: " << Rect.getArea() << endl; Tri.setWidth(5);
Tri.setHeight(7); // 输出对象的面积 cout << "Total Triangle area: " << Tri.getArea() << endl; return 0; }
当上面的代码被编译和执行时,它会产生下列结果:
如果你也想成为程序员,想要快速掌握编程,赶紧关注小编加入学习企鹅圈子吧!
里面有资深专业软件开发工程师,在线解答你的所有疑惑~编程语言入门“so easy”
资料包含:编程入门、游戏编程、课程设计等。
免费学习书籍:
免费学习资料:
Total Rectangle area: 35 Total Triangle area: 17
从上面的例中,我们可以看到一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。