38 C++ 中的抽象类和接口

1 什么是抽象类?

  • 面向对象中的抽象概念

  • 在进行面向对象分析时,会发现一些抽象的概念。如:图形的面积如何计算?

  • 在现实中需要知道具体的图形类型才能求面积,所以对概念上的“图形”求面积是没有意义的!

    • Shape 只是一个概念上的类型,没有具体的对象
    class Shape
    {
    public:
        double area()
        {
            return 0;
        }
    };
    
  • 问题:Shape 类有必要存在么?

  • 面向对象中的抽象类

    • 可用于表示现实世界中的抽象概念
    • 是一种只能定义类型,而不能产生对象的类
    • 只能被继承并重写相关函数
    • 直接特征是相关函数没有完整的实现

2 抽象类与纯虚函数

  • C++ 语言中没有抽象类的概念

  • C++ 中通过纯虚函数实现抽象类

  • 纯虚函数是指只定义原型的成员函数

  • 一个 C++ 类中存在纯虚函数就成为了抽象类

  • 纯虚函数的语法规则

    • = 0 用于告诉编译器当前是声明纯虚函数,因此不需要定义函数体
    class Shape
    {
    public:
        virtual double area() = 0;
    };
    
  • 示例:抽象类

    • Demo
      #include <iostream>
      #include <string>
      
      using namespace std;
      
      //抽象类
      class Shape
      {
      public:
          virtual double area() = 0;
      };
      
      class Rect : public Shape
      {
          int ma;
          int mb;
      public:
          Rect(int a, int b)
          {
              ma = a;
              mb = b;
          }
          double area()
          {
              return ma * mb;
          }
      };
      
      class Circle : public Shape
      {
          int mr;
      public:
          Circle(int r)
          {
              mr = r;
          }
          double area()
          {
              return 3.14 * mr * mr;
          }
      };
      
      void area(Shape* p)
      {
          double r = p->area();
          
          cout << "r = " << r << endl;
      }
      
      int main()
      {
          Rect rect(1, 2);
          Circle circle(10);
          
          area(&rect);
          area(&circle);
          
          return 0;
      }
    
    • 编译运行

      r = 2
      r = 314.3
      
  • 抽象类只能用作父类被继承,不可以生成对象,但可以生成抽象类的指针

  • 子类必须实现纯虚函数的具体功能

  • 纯虚函数被实现后成为虚函数

  • 如果子类没有实现纯虚函数,则子类成为抽象类

3 接口

  • 满足下面条件的 C++ 类则成为接口

    • 类中没有定义任何的成员变量
    • 所有的成员函数都是公有的
    • 所有的成员函数都是纯虚函数
    • 接口是一种特殊的抽象类
  • 示例:接口

    • Demo
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Channel
    {
    public:
        virtual bool open() = 0;
        virtual void close() = 0;
        virtual bool send(char* buf, int len) = 0;
        virtual int receive(char* buf, int len) = 0;
    };
    
    int main()
    {
        return 0;
    }
posted @ 2020-10-30 19:46  nxgy  阅读(63)  评论(0编辑  收藏  举报