接口(抽象类)

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

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

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

class Box
{
    public:
        virtual double getVolume()=0;//纯虚函数
    private:
        double length;//长度
        double breadth;//宽度
        double length;//高度
};

设计抽象类的目的是为了给其他类提供一个可以继承的适当的基类。抽象类不能用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。

可用于实例化的类被称为具体类

抽象类的实例

请看下面的实例,基类 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;
}

>>Total Rectangle area: 35
Total Triangle area: 17

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

设计策略

面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。

外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。

这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/88827641