暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++的纯虚函数使用与接口实现

嵌入式情报局 2021-08-08
1805
大家好,我是情报小哥!
前面小哥跟大家聊了一下虚函数的一些知识点和注意事项,相关知识点可以看本专辑前面的内容,虚函数主要是为了父类指针访问子类同名成员方法而引入的,即通过重写了父类的方法,从而实现多态。

01

为何引入纯虚函数

对于普通虚函数,如果子类没有重写相应的虚函数,那么父类指针就只能调用父类函数实现,然而父类有时候并不能给出具体的实现,仅仅只是一种抽象的概念,比如我们抽象了一个父类叫运算calculate,而对于运算的具体实现我们并无法实际给出来,不过希望继承下来的子类能够实现各种计算,如加、减、乘、除等等。

很多朋友就想了,没实现就没实现呗,函数体内啥也不做不就行了吗?

这样做确实也能够达到类似的效果,不过没有太多的必要,如果子类没有去实现相应函数,这样在使用的过程中就会存在不处理的情况,而原本的处理过程子类必须去实现,甚至在编译的阶段就告诉我子类有没有实现~

基于这样的需求,就有了一种没有具体实现的虚函数,称为纯虚函数。

02

纯虚函数的使用

纯虚函数的使用还是比较简单的,即在虚函数声明后面加上"=0",作为其标识即可。
那么我们下面以这个demo来体验一下:
 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、如果我们使用父类直接去定义(专业一点叫实例化)一个对象,编译会直接会报错,所以带有纯虚函数的类不能直接实例化为一个对象,因为其没有给出相应的具体实现,如下图所示:

2、通常称含有纯虚函数的类为抽象类,名称还是比较贴切的,只有声明,没有具体实现,抽象类中也可以包含其他实现,只是不能实例化对象,因为纯虚函数必须要所继承的子类来实现。
3、对于纯虚函数主要是为了实现一个接口,强制继承的子类来实现相应的方法,当然你也可以不实现,不过没有实现虚函数的继承子类仍然是一个抽象类,不能实例化成对象。

03

纯虚函数实现接口

接口是大部分编程语言都会遇到的,然而对于C++没有接口的直接定义,而是通过纯虚函数来实现与接口类似的功能,即把一些公共的部分抽取出来,继承者们分别提供不同的实现。
接口部分仅仅只是对相关的方法进行声明不需要有具体的实现,而子类继承以后必须实现相应的方法供对象使用。
那么下面小哥给大家看一个例子来说明C++进行接口实现:


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}

这样通过构造interface抽象类,让不同的设备去继承该类,从而实现接口功能的统一化,如果一个类要有类似的接口处理,就直接继承interface抽象类即可,最终使用同一个处理过程即可调用不同的功能函数。

enjoy~

最  后 


这里小哥就介绍了一下C++纯虚函数和接口实现的相关知识点,希望本文能够对你有帮助,该系列还会持续更新,大家可以持续关注~

小哥搜集了一些嵌入式学习资料,公众号内回复"1024"即可找到下载链接~

推荐好文  点击蓝色字体即可跳转


☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

专辑|从单片机到Linux

☞ 专辑|电能控制技术

文章转载自嵌入式情报局,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论