【C++深度解析】37、C++ 中的抽象类和接口
程序员文章站
2024-03-21 16:32:46
...
文章目录
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、只存在共有的纯虚函数的类是接口
上一篇: win10安装pytorch