C++在继承中虚函数、纯虚函数、普通函数,三者的区别1.虚函数(impurevirtual)C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。子类可以重写父类的虚函数实现子类的特殊化。如下就是一个父类中的虚函数:classA{public:virtualvoidout2(strings){coutA(out2):sendl;}};2.纯虚函数(purevirtual)C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。C++中的纯虚函数也是一种“运行时多态”。如下面的类包含纯虚函数,就是“抽象类”:classA{public:virtualvoidout1(strings)=0;virtualvoidout2(strings){coutA(out2):sendl;}};3.普通函数(no-virtual)普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。普通函数是父类为子类提供的“强制实现”。因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。4.程序综合实例#includeiostreamusingnamespacestd;classA{public:virtualvoidout1()=0;///由子类实现virtual~A(){};virtualvoidout2()///默认实现{coutA(out2)endl;}voidout3()///强制实现{coutA(out3)endl;}};classB:publicA{public:virtual~B(){};voidout1(){coutB(out1)endl;}voidout2(){coutB(out2)endl;}voidout3(){coutB(out3)endl;}};intmain(){A*ab=newB;ab-out1();ab-out2();ab-out3();cout************************endl;B*bb=newB;bb-out1();bb-out2();bb-out3();deleteab;deletebb;return0;}C++虚函数与纯虚函数用法与区别(转)1.虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstractclass),而只含有虚函数的类(class)不能被称为抽象类(abstractclass)。2.虚函数可以被直接使用,也可以被子类(subclass)重载以后以多态的形式调用,而纯虚函数必须在子类(subclass)中实现该函数才可以使用,因为纯虚函数在基类(baseclass)只有声明而没有定义。3.虚函数和纯虚函数都可以在子类(subclass)中被重载,以多态的形式被调用。4.虚函数和纯虚函数通常存在于抽象基类(abstractbaseclass-ABC)之中,被继承的子类重载,目的是提供一个统一的接口。5.虚函数的定义形式:virtual{methodbody}纯虚函数的定义形式:virtual{}=0;在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-timebind),而且被两者修饰的函数生命周期(liferecycle)也不一样。6.虚函数必须实现,如果不实现,编译器将报错,错误提示为:errorLNK****:unresolvedexternalsymbolpublic:virtualvoid__thiscallClassName::virtualFunctionName(void)7.对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。8.实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。9.虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数10.多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。a.编译时多态性:通过重载函数实现b运行时多态性:通过虚函数实现。11.如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。C++虚函数与纯虚函数用法与区别(转)1.虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstractclass),而只含有虚函数的类(class)不能被称为抽象类(abstractclass)。2.虚函数可以被直接使用,也可以被子类(subclass)重载以后以多态的形式调用,而纯虚函数必须在子类(subclass)中实现该函数才可以使用,因为纯虚函数在基类(baseclass)只有声明而没有定义。3.虚函数和纯虚函数都可以在子类(subclass)中被重载,以多态的形式被调用。4.虚函数和纯虚函数通常存在于抽象基类(abstractbaseclass-ABC)之中,被继承的子类重载,目的是提供一个统一的接口。5.虚函数的定义形式:virtual{methodbody}纯虚函数的定义形式:virtual{}=0;在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-timebind),而且被两者修饰的函数生命周期(liferecycle)也不一样。6.虚函数必须实现,如果不实现,编译器将报错,错误提示为:errorLNK****:unresolvedexternalsymbolpublic:virtualvoid__thiscallClassName::virtualFunctionName(void)7.对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。8.实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。9.虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数10.多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。a.编译时多态性:通过重载函数实现b运行时多态性:通过虚函数实现。11.如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。复制代码1//fatherclass23classVirtualbase45{67public:89virtualvoidDemon()=0;//pruevirtualfunction1011virtualvoidBase(){coutthisisfartherclass};1213}1415//subclass1617classSubVirtual:publicVirtualbase1819{2021public:2223voidDemon(){coutthisisSubVirtual!2425voidBase(){coutthisissubclassBase2627}2829/*3031instanceclassandsample3233*/3435voidmain()3637{3839Virtualbase*inst=newSubVirtual();//multstatepointer4041inst-Demon();4243inst-Base();4445//inst=newVirtualbase();4647//inst-Base()4849return;5051}本文章已收录于:虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数!纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!虚函数引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。classCman{public:virtualvoidEat(){……};voidMove();private:};classCChild:publicCMan{public:virtualvoidEat(){……};private:};CManm_man;CChildm_child;CMan*p;//这才是使用的精髓,如果不定义基类的指针去使用,没有太大的意义p=&m_man;p-Eat();//始终调用CMan的Eat成员函数,不会调用CChild的p=&m_child;p-Eat();//如果子类实现(覆盖)了该方法,则始终调用CChild的Eat函数//不会调用CMan的Eat方法;如果子类没有实现该函数,则调用CMan的Eat函数p-Move();//子类中没有该成员函数,所以调用的是基类中的纯虚函数引入原因:1、同“虚函数”;2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。纯虚函数就是基类只定义了函数体,没有实现过程,定义方法如:virtualvoidEat()=0;不要在cpp中定义;纯虚函数相当于接口,不能直接实例话,需要派生类来实现函数定义;有的人可能在想,定义这些有什么用啊,我觉得很有用,比如你想描述一些事物的属性给别人,而自己不想去实现,就可以定义为纯虚函数。说的再透彻一些。比如盖楼房,你是老板,你给建筑公司描述清楚你的楼房的特性,多少层,楼顶要有个花园什么的,建筑公司就可以按照你的方法去实现了,如果你不说清楚这些,可能建筑公司不太了解你需要楼房的特性。用纯需函数就可以很好的分工合作了虚函数和纯虚函数区别观点一:类里声明为虚函数的话,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,这样编译器就可以使用后期绑定来达到多态了纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。classA{protected:voidfoo();//普通类函数virtualvoidfoo1();//虚函数virtualvoidfoo2()=0;//纯虚函数}观点二:虚函数在子类里面也可以不重载的;但纯虚必须在子类去实现,这就像Java的接口一样。通常我们把很多函数加上virtual,是一个好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,因为你很难预料到父类里面的这个函数不在子类里面不去修改它的实现观点三:虚函数的类用于“实作继承”,继承接口的同时也继承了父类的实现。当然我们也可以完成自己的实现。纯虚函数的类用于“介面继承”,主要用于通信协议方面。关注的是接口的统一性,实现由子类完成。一般来说,介面类中只有纯虚函数的。观点四:带纯虚函数的类叫虚基类,这种基类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。这样的类也叫抽象类。虚函数是为了继承接口和默认行为纯虚函数只是继承接口,行为必须重新定义