上一节:

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