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

一、为何引入纯虚函数

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

二、纯虚函数的使用

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

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

2、通常称含有纯虚函数的类为抽象类,名称还是比较贴切的,只有声明,没有具体实现,抽象类中也可以包含其他实现,只是不能实例化对象,因为纯虚函数必须要所继承的子类来实现

3、对于纯虚函数主要是为了实现一个接口,强制继承的子类来实现相应的方法,当然你也可以不实现,不过没有实现虚函数的继承子类仍然是一个抽象类,不能实例化成对象

三、纯虚函数实现接口

cpp 复制代码
 1 #include <iostream>
 2 using namespace std;
 3
 4 /* 接口抽象类的定义 */ 
 5 class Interface {
 6 public:
 7    virtual void method1() = 0;
 8    virtual void method2() = 0;
 9 };
10
11 class Device1 : public Interface
12 {
13 public:
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
24 class Device2 : public Interface
25 {
26 public:
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
37 class Process {
38 public:
39    void Parse(Interface *api) {
40        api->method1();
41        api->method2();
42    }
43 };
44
45 int 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抽象类即可,最终使用同一个处理过程即可调用不同的功能函数


推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/VsFMs

相关推荐
si莉亚9 分钟前
ROS2安装EVO工具包
linux·开发语言·c++·开源
清心歌17 分钟前
CopyOnWriteArrayList 实现原理
java·开发语言
智者知已应修善业28 分钟前
【51单片机单按键切换广告屏】2023-5-17
c++·经验分享·笔记·算法·51单片机
良木生香41 分钟前
【C++初阶】C++入门相关知识(2):输入输出 & 缺省参数 & 函数重载
开发语言·c++
小此方41 分钟前
Re:从零开始的 C++ 进阶篇(三)彻底搞懂 C++ 多态:虚函数、虚表与动态绑定的底层原理
c++
忘梓.42 分钟前
墨色规则与血色节点:C++红黑树设计与实现探秘
java·开发语言·c++
hhh3u3u3u42 分钟前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
凤年徐1 小时前
C++手撕红黑树:从0到200行,拿下STL map底层核心
c++·后端·算法
星河耀银海1 小时前
C++ 模板进阶:特化、萃取与可变参数模板
java·开发语言·c++
cccccc语言我来了1 小时前
【C++---unordered_set/map底层封装】个不拘一格的集合。它不似有序集合那般循规蹈矩,而是以一种洒脱不羁的方式,将元素们随意地散落其中。每一个元素都是独一无二的。
开发语言·c++·哈希算法