C++ 接口(抽象类)理解

接口描述了类的行为和功能,而不需要完成类的特定实现。

接口是抽象类

C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。

如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。
纯虚函数是通过在声明中使用 “= 0” 来指定的,如下所示:

 
  1. class Box
  2. {
  3. public:
  4. // 纯虚函数
  5. virtual double getVolume() = 0;
  6. private:
  7. double length; // 长度
  8. double breadth; // 宽度
  9. double height; // 高度
  10. };

设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。

抽象类不能被用于实例化对象,它只能作为接口使用。

因此,如果一个 ABC 的子类需要被实例化,则必须实现每个虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重载纯虚函数,就尝试实例化该类的对象,会导致编译错误。

抽象类设计举例

基类 Shape 提供了一个接口 getArea(),在两个派生类 Rectangle 和 Triangle 中分别实现了 getArea():

 
  1. #include <iostream>
  2. using namespace std;
  3. // 基类
  4. class Shape
  5. {
  6. public:
  7. // 提供接口框架的纯虚函数
  8. virtual int getArea() = 0;
  9. void setWidth(int w)
  10. {
  11. width = w;
  12. }
  13. void setHeight(int h)
  14. {
  15. height = h;
  16. }
  17. protected:
  18. int width;
  19. int height;
  20. };
  21. // 派生类
  22. class Rectangle: public Shape
  23. {
  24. public:
  25. int getArea()
  26. {
  27. return (width * height);
  28. }
  29. };
  30. class Triangle: public Shape
  31. {
  32. public:
  33. int getArea()
  34. {
  35. return (width * height)/2;
  36. }
  37. };
  38. int main(void)
  39. {
  40. Rectangle Rect;
  41. Triangle Tri;
  42. Rect.setWidth(5);
  43. Rect.setHeight(7);
  44. // 输出对象的面积
  45. cout << "Total Rectangle area: " << Rect.getArea() << endl;
  46. Tri.setWidth(5);
  47. Tri.setHeight(7);
  48. // 输出对象的面积
  49. cout << "Total Triangle area: " << Tri.getArea() << endl;
  50. return 0;
  51. }

此案例的输入如下

 
  1. Total Rectangle area: 35
  2. Total Triangle area: 17

从上面的实例中,我们可以看到一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。

接口设计策略

面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。
然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。
外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。
这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。

总之,接口是抽象类,是形而上的,而具体类是形而下的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值