【C++深度解析】37、C++ 中的抽象类和接口

1 抽象类

1.1 为什么有抽象类

在进行面向对象分析时,会有一些抽象的概念,如下图所示,矩形类和圆形类是形状类的子类,他们中都有求面积的函数。但是只有对具体的形状求面积才有意义,对概念上的”图形“求面积是没有意义的!
在这里插入图片描述
图形只是一个概念上的类型,没有具体的对象。但是图形类依然有存在的必要。

这里的图形类应该设计成抽象类,用于表示现实世界中的抽象概念,没有具体的对象,相关函数没有被完整的实现,所以只能被继承并重写相关函数。

1.2 抽象类与纯虚函数

我们前面学习了虚函数,通过 virtual 关键字实现,不给出函数体的实现,直接 ”= 0“ 就是纯虚函数

语法规则如下:
在这里插入图片描述
”=0“ 告诉编译器当前是声明纯虚函数,不需要定义函数体

抽象类

  • 存在纯虚函数的类是抽象类
  • 纯虚函数是只定义原型的成员函数,不给出实现
  • 纯虚函数被实现后成为虚函数
  • 如果子类没有实现所有的纯虚函数,则子类仍然是抽象类
// 37-1.cpp
#include<iostream>
using namespace std;
class Shape
{
public:
    virtual double area() = 0;
};
class Rect : public Shape
{
public:
    Rect(int a, int b) : ma(a), mb(b) {}
    double area()
    {
        return ma * mb;
    }
private:
    int ma;
    int mb;
};
class Circle : public Shape
{
public:
    Circle(int r) : mr(r) {}
    double area()
    {
        return 3.14 * mr * mr;
    }
private:
    int mr;
};
void area(Shape* p)
{
    double s = p->area();
    cout << "area = " << s << endl;
}
int main()
{
    Rect rect(1, 2);
    Circle circle(10);
    area(&rect);
    area(&circle);
    return 0;
}

Shape 是抽象类,不能生成对象,这样避免了在不知道的情况下生成 Shape 对象,因为 Shape 对象是没有意义的。纯虚函数被实现后成为虚函数,实现多态,抽象类的指针子类的对象,可以根据对象类型动态调用子类的成员函数,求具体形状的面积。

$ g++ 37-1.cpp -o 37-1
$ ./37-1
area = 2
area = 314

2 接口

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

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

我们实现一个接口,如下所示:

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;
};

没有成员变量,只有公有的纯虚函数。

3 小结

1、抽象类用于描述现实世界中的抽象概念
2、通过纯虚函数实现抽象类
3、抽象类只能被继承,不能创建对象
4、只存在共有的纯虚函数的类是接口

发布了298 篇原创文章 · 获赞 181 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/104432699
今日推荐