站群网站推广工具费用,mvc 网站建设,互联网广告投放平台加盟,seo网站概述虚函数主要是为了父类指针访问子类同名成员方法而引入的#xff0c;即通过重写了父类的方法#xff0c;从而实现多态。 01 为何引入纯虚函数
对于普通虚函数#xff0c;如果子类没有重写相应的虚函数#xff0c;那么父类指针就只能调用父类函数实现#xff0c;然而父类有… 虚函数主要是为了父类指针访问子类同名成员方法而引入的即通过重写了父类的方法从而实现多态。 01 为何引入纯虚函数
对于普通虚函数如果子类没有重写相应的虚函数那么父类指针就只能调用父类函数实现然而父类有时候并不能给出具体的实现仅仅只是一种抽象的概念比如我们抽象了一个父类叫运算calculate而对于运算的具体实现我们并无法实际给出来不过希望继承下来的子类能够实现各种计算如加、减、乘、除等等。
很多朋友就想了没实现就没实现呗函数体内啥也不做不就行了吗
这样做确实也能够达到类似的效果不过没有太多的必要如果子类没有去实现相应函数这样在使用的过程中就会存在不处理的情况而原本的处理过程子类必须去实现甚至在编译的阶段就告诉我子类有没有实现~
基于这样的需求就有了一种没有具体实现的虚函数称为纯虚函数。
02 纯虚函数的使用
纯虚函数的使用还是比较简单的即在虚函数声明后面加上0,作为其标识即可。 那么我们下面以这个demo来体验一下:
#include iostream
using namespace std;class abstructParent
{
public:void function1(){cout abstructParent hello Cendl; }virtual void function2() 0; //纯虚函数 };class Child :public abstructParent
{
public:void function2(){cout Child hello Cendl; }
};int main(int argc, char** argv) {Child obj;obj.function1();obj.function2();return 0;
}以上通过子类继承父类来实现其输出结果为: 从上面的输出结果我们可以了解到几点:
1、如果我们使用父类直接去定义(专业一点叫实例化)一个对象编译会直接会报错所以带有纯虚函数的类不能直接实例化为一个对象因为其没有给出相应的具体实现如下图所示: 2、通常称含有纯虚函数的类为抽象类名称还是比较贴切的只有声明没有具体实现抽象类中也可以包含其他实现只是不能实例化对象因为纯虚函数必须要所继承的子类来实现。
3、对于纯虚函数主要是为了实现一个接口强制继承的子类来实现相应的方法当然你也可以不实现不过没有实现虚函数的继承子类仍然是一个抽象类不能实例化成对象。
03 纯虚函数实现接口
接口是大部分编程语言都会遇到的然而对于C没有接口的直接定义而是通过纯虚函数来实现与接口类似的功能即把一些公共的部分抽取出来继承者们分别提供不同的实现。 接口部分仅仅只是对相关的方法进行声明不需要有具体的实现而子类继承以后必须实现相应的方法供对象使用。
下面给大家看一个例子来说明C进行接口实现:
#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) {coutDevice1 method1endl; }virtual void method2(void) {coutDevice1 method2endl; }
};class Device2 : public Interface
{
public:virtual void method1(void) {coutDevice2 method1endl; }virtual void method2(void) {coutDevice2 method2endl; }
};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抽象类即可最终使用同一个处理过程即可调用不同的功能函数。