抽象类和接口

1. 什么是抽象类

在进行面向对象分析时,会发现一些抽象的概念,比如图形Shape,要想计算图形的面积,就必须先知道具体的图形类型,因为对概念上的“图形”求面积是没有意义的。
在面向对象理论中,现实世界中的抽象概念可以用抽象类表示

  • 抽象类是一种只能定义类型、不能产生对象的类
  • 抽象类的直接特征是相关函数没有完整的实现
  • 抽象类只能用于继承,并在子类中重写相关函数

2. C++中的抽象类与接口

C++没有抽象类的概念,而是通过纯虚函数来实现抽象类纯虚函数是指只定义函数原型的成员函数,语法规则为:

class Shape
{
public:
    virtual double area() = 0;  // "=0"用于告诉编译器当前是声明纯虚函数,不需要定义函数体
};
  • 类中存在纯虚函数,那么这个类就成为抽象类,只能用作父类被继承
  • 子类必须实现纯虚函数的具体功能
  • 纯虚函数被实现后成为虚函数
  • 如果子类没有实现全部的纯虚函数,则子类成为抽象类
#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;
}

如果一个C++类满足下面的条件,则这个类被称为接口(Interface)

  • 类中没有定义任何的成员变量
  • 所有的成员函数都是public的
  • 所有的成员函数都是纯虚函数

接口是一种特殊的抽象类。

class Interface
{
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;
};
posted @ 2019-09-28 13:19  原野追逐  阅读(277)  评论(0编辑  收藏  举报