
01
为何引入纯虚函数

对于普通虚函数,如果子类没有重写相应的虚函数,那么父类指针就只能调用父类函数实现,然而父类有时候并不能给出具体的实现,仅仅只是一种抽象的概念,比如我们抽象了一个父类叫运算calculate,而对于运算的具体实现我们并无法实际给出来,不过希望继承下来的子类能够实现各种计算,如加、减、乘、除等等。
很多朋友就想了,没实现就没实现呗,函数体内啥也不做不就行了吗?
这样做确实也能够达到类似的效果,不过没有太多的必要,如果子类没有去实现相应函数,这样在使用的过程中就会存在不处理的情况,而原本的处理过程子类必须去实现,甚至在编译的阶段就告诉我子类有没有实现~
基于这样的需求,就有了一种没有具体实现的虚函数,称为纯虚函数。
02
纯虚函数的使用

1#include <iostream>
2using namespace std;
3
4class abstructParent
5{
6public:
7 void function1()
8 {
9 cout<<" abstructParent hello C++"<<endl;
10
11 }
12 virtual void function2() = 0; //纯虚函数
13
14};
15
16class Child :public abstructParent
17{
18public:
19 void function2()
20 {
21 cout<<" Child hello C++"<<endl;
22
23 }
24};
25
26int main(int argc, char** argv) {
27
28 Child obj;
29
30 obj.function1();
31 obj.function2();
32
33 return 0;
34}

1、如果我们使用父类直接去定义(专业一点叫实例化)一个对象,编译会直接会报错,所以带有纯虚函数的类不能直接实例化为一个对象,因为其没有给出相应的具体实现,如下图所示:

03
纯虚函数实现接口


1#include <iostream>
2using namespace std;
3
4/* 接口抽象类的定义 */
5class Interface {
6public:
7 virtual void method1() = 0;
8 virtual void method2() = 0;
9};
10
11class Device1 : public Interface
12{
13public:
14 virtual void method1(void)
15 {
16 cout<<"Device1 method1"<<endl;
17 }
18 virtual void method2(void)
19 {
20 cout<<"Device1 method2"<<endl;
21 }
22};
23
24class Device2 : public Interface
25{
26public:
27 virtual void method1(void)
28 {
29 cout<<"Device2 method1"<<endl;
30 }
31 virtual void method2(void)
32 {
33 cout<<"Device2 method2"<<endl;
34 }
35};
36
37class Process {
38public:
39 void Parse(Interface *api) {
40 api->method1();
41 api->method2();
42 }
43};
44
45int main(void)
46{
47 Process process;
48
49 Device1 dev1;
50 Device2 dev2;
51
52 process.Parse(&dev1);
53 process.Parse(&dev2);
54
55 return 0;
56}

enjoy~
最 后
这里小哥就介绍了一下C++纯虚函数和接口实现的相关知识点,希望本文能够对你有帮助,该系列还会持续更新,大家可以持续关注~
小哥搜集了一些嵌入式学习资料,公众号内回复"1024"即可找到下载链接~
推荐好文 点击蓝色字体即可跳转
☞ 专辑|手撕C语言
☞ 专辑|经验分享





