对于普通虚函数,如果子类没有重写相应的虚函数,那么父类指针就只能调用父类函数实现,然而父类有时候并不能给出具体的实现,仅仅只是一种抽象的概念,比如我们抽象了一个父类叫运算calculate,而对于运算的具体实现我们并无法实际给出来,不过希望继承下来的子类能够实现各种计算,基于这样的需求,就有了一种没有具体实现的虚函数,称为纯虚函数
二、纯虚函数的使用
#include <iostream> using namespace std; class abstructParent { public: void function1() { cout<<" abstructParent hello C++"<<endl; } virtual void function2() = 0; //纯虚函数 }; class Child :public abstructParent { public: void function2() { cout<<" Child hello C++"<<endl; } }; int main(int argc, char** argv) { Child obj; obj.function1(); obj.function2(); return 0; }
1、如果我们使用父类直接去定义(专业一点叫实例化)一个对象,编译会直接会报错,所以带有纯虚函数的类不能直接实例化为一个对象,因为其没有给出相应的具体实现
2、通常称含有纯虚函数的类为抽象类,名称还是比较贴切的,只有声明,没有具体实现,抽象类中也可以包含其他实现,只是不能实例化对象,因为纯虚函数必须要所继承的子类来实现
3、对于纯虚函数主要是为了实现一个接口,强制继承的子类来实现相应的方法,当然你也可以不实现,不过没有实现虚函数的继承子类仍然是一个抽象类,不能实例化成对象
三、纯虚函数实现接口
#include <iostream> using namespace std; /* 接口抽象类的定义 */ class Interface { public: virtual void method1() = 0; virtual void method2() = 0; }; class Device1 : public Interface { public: virtual void method1(void) { cout<<"Device1 method1"<<endl; } virtual void method2(void) { cout<<"Device1 method2"<<endl; } }; class Device2 : public Interface { public: virtual void method1(void) { cout<<"Device2 method1"<<endl; } virtual void method2(void) { cout<<"Device2 method2"<<endl; } }; class Process { public: void Parse(Interface *api) { api->method1(); api->method2(); } }; int main(void) { Process process; Device1 dev1; Device2 dev2; process.Parse(&dev1); process.Parse(&dev2); return 0; }
通过构造interface抽象类,让不同的设备去继承该类,从而实现接口功能的统一化,如果一个类要有类似的接口处理,就直接继承interface抽象类即可,最终使用同一个处理过程即可调用不同的功能函数
推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/VsFMs