虚函数纯虚函数普通函数.docx_第1页
虚函数纯虚函数普通函数.docx_第2页
虚函数纯虚函数普通函数.docx_第3页
虚函数纯虚函数普通函数.docx_第4页
虚函数纯虚函数普通函数.docx_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+ 在继承中虚函数、纯虚函数、普通函数,三者的区别1.虚函数(impure virtual)C+的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。子类可以重写父类的虚函数实现子类的特殊化。如下就是一个父类中的虚函数:class Apublic: virtual void out2(string s) coutA(out2):sendl; ;2.纯虚函数(pure virtual)C+中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。C+中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。C+中的纯虚函数也是一种“运行时多态”。如下面的类包含纯虚函数,就是“抽象类”:class Apublic: virtual void out1(string s)=0; virtual void out2(string s) coutA(out2):sendl; ;3.普通函数(no-virtual)普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。普通函数是父类为子类提供的“强制实现”。因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。4.程序综合实例#include using namespace std;class Apublic: virtual void out1()=0; /由子类实现 virtual A(); virtual void out2() /默认实现 coutA(out2)endl; void out3() /强制实现 coutA(out3)endl; ;class B:public Apublic: virtual B(); void out1() coutB(out1)endl; void out2() coutB(out2)endl; void out3() coutB(out3)out1(); ab-out2(); ab-out3(); cout*out1(); bb-out2(); bb-out3(); delete ab; delete bb; return 0;C+虚函数与纯虚函数用法与区别(转)1.虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstractclass),而只含有虚函数的类(class)不能被称为抽象类(abstractclass)。2.虚函数可以被直接使用,也可以被子类(subclass)重载以后以多态的形式调用,而纯虚函数必须在子类(subclass)中实现该函数才可以使用,因为纯虚函数在基类(baseclass)只有声明而没有定义。3.虚函数和纯虚函数都可以在子类(subclass)中被重载,以多态的形式被调用。4.虚函数和纯虚函数通常存在于抽象基类(abstractbaseclass-ABC)之中,被继承的子类重载,目的是提供一个统一的接口。5.虚函数的定义形式:virtualmethodbody纯虚函数的定义形式: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)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。 3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。 4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。 5. 虚函数的定义形式:virtual method body纯虚函数的定义形式:virtual = 0;在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。 6. 虚函数必须实现,如果不实现,编译器将报错,错误提示为:error LNK*: unresolved external symbol public: virtual void _thiscallClassName:virtualFunctionName(void)7. 对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。 8. 实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。9. 虚函数是C+中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数10. 多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C+支持两种多态性:编译时多态性,运行时多态性。a.编译时多态性:通过重载函数实现b 运行时多态性:通过虚函数实现。 11. 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。复制代码 1 /father class 2 3 class Virtualbase 4 5 6 7 public: 8 9 virtual void Demon()= 0; /prue virtual function10 11 virtual void Base() coutthis is farther class;12 13 14 15 /sub class16 17 class SubVirtual :public Virtualbase18 19 20 21 public:22 23 void Demon() cout this is SubVirtual! 24 25 void Base() coutthis is subclass BaseDemon();42 43 inst-Base();44 45 / inst = new Virtualbase();46 47 / inst-Base()48 49 return ;50 51 本文章已收录于: 虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数!纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!虚函数引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。class Cmanpublic:virtual void Eat();void Move();private:;class CChild : public CManpublic:virtual void Eat();private:;CMan m_man;CChild m_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、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。纯虚函数就是基类只定义了函数体,没有实现过程,定义方法如: virtual void Eat() = 0; 不要 在cpp中定义;纯虚函数相当于接口,不能直接实例话,需要派生类来实现函数定义;有的人可能在想,定义这些有什么用啊 ,我觉得很有用,比如你想描述一些事物的属性给别人,而自己不想去实现,就可以定义为纯虚函数。说的再透彻一些。比如盖楼房,你是老板,你给建筑公司描述清楚你的楼房的特性,多少层,楼顶要有个花园什么的,建筑公司就可以按照你的方法去实现了,如果你不说清楚这些,可能建筑公司不太了解你需要楼房的特性。用纯需函数就可以很好的分工合作了虚函数和纯虚函数区别观点一:类里声明为虚函数的话,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,这样编译器就可以使用后期绑定来达到多态了纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。class Aprotected:void foo();/普通类函数virtual void foo1();/虚函数virtual void foo2() = 0;/纯虚函数观点二:虚函数在子类里面也可以不重载的;但纯虚必须在子类去实现,这就像Java的接口一样。通常我们把很多函数加上virtual,是一个好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论