C++抽象类接口
呆呆上一章讲了封装、继承、多态 (opens new window), 这里讲一个C++从别处借来的概念:接口
C++没有为接口定义其独特的关键字,但随着面向接口编程的提出,设计模式的推广;接口也成了一个编程中很重要的概念
C++的接口是借用纯虚函数实现的,下面我们来了解一下C++的接口实现
设计模式:大家有兴趣可以看看呆呆的另一个系列文章;设计模式 (opens new window)
# 接口
接口定义
硬件类接口:指同一计算机不同功能层之间的通信规则称为接口
软件类接口:指对协定进行定义的引用类型。其他类型实现接口,以保证它们支持某些操作。接口指定必须由类提供的成员或实现它的其他接口。与类相似,接口可以包含方法、属性、索引器和事件作为成员。
由上可以发现:接口只定义规则,不能创建对象实现业务。
呆呆对接口的理解
对外:一个协议,用于和程序的其他部分通信; 告知程序的其他部分,这里的功能有什么
对内:一个规则,用于告知所有的子类功能要做什么
来自 呆呆
# 纯虚函数
一般形式:
class 类名
{
范围修饰符:
virtual 返回值 函数名(参数列表) = 0; // 纯虚函数
};
1
2
3
4
5
6
2
3
4
5
6
如上:
类中 一个函数 符合: 有 virtual修饰符、有“=0”、无函数实现体; 就是纯虚函数
如果一个类中有纯虚函数,那么这个类就无法事例化
# C++的接口
依据接口的定义,可以用C++纯虚函数来完成:C++中接口的定义
定义
严格定义:如果一个类中的函数都是纯虚函数,这个类就是接口类
宽松定义:如果一个类中的函数存在纯虚函数,这个类就是接口类
相对而言,呆呆更偏向使用严格定义;这样能更好的使用面向接口编程的概念。宽松定义,更多的可能是对已有复杂代码的一种妥协。
例:
#include <iostream>
#include <cstring>
using namespace std;
// 定义一个 Pet 接口
class Pet
{
public:
virtual ~Pet() {} // 虚析构 是必须的,防止内存泄漏
virtual void eat() = 0; // 纯虚函数
};
// 实现一个Cat
class Cat : public Pet
{
public:
virtual void eat() override // 子类声明了同名eat函数,就会隐藏父类eat
{
cout << "Cat eat!!!" << endl;
}
};
int main(int argc, char* argv[])
{
Pet* pPet = new Cat();
pPet->eat();
delete pPet;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
结果:
Cat eat!!!
编辑 (opens new window)
上次更新: 2023/04/09, 07:45:01