虚函数和纯虚函数_第1页
虚函数和纯虚函数_第2页
虚函数和纯虚函数_第3页
虚函数和纯虚函数_第4页
虚函数和纯虚函数_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、这个是C+内容!虚函数和纯虚函数不是一个东西!虚函数和纯虚函数在面向对象的 C+语言中,虚函数(virtual fun ction )是一个非常重要的概念。因为它充 分体现了面向对象思想中的继承和多态性这两大特性,在C+语言里应用极广。比如在微软的MFC类库中,你会发现很多函数都有 virtual关键字,也就是说,它们都是虚函数。难 怪有人甚至称虚函数是 C+语言的精髓。那么,什么是虚函数呢,我们先来看看微软的解释:虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。摘自MSDN这个定义说得不是很明白。MSDN中

2、还给出了一个例子,但是它的例子也并不能很好的说明问题。我们自己编写这样一个例子:# i nelude "stdio.h"# i nclude "conio.h"class Pare ntpublic:char data20;void Fun cti on 1();virtual void Function2();/ 这里声明 Function2 是虚函数pare nt;void Pare nt:F unction 1()prin tf("This is pare nt,fu nction1n");void Pare nt:F unct

3、ion 2()prin tf("This is pare nt,fu nctio n2n");class Child:public Parentvoid Fun cti on 1();void Fun cti on 2(); child;void Child:Fu nctio n1()prin tf("This is child,fu nctio n1n");void Child:Fu nctio n2()prin tf("This is child,fu nctio n2n");int main (i nt argc, char*

4、argv)Parent *p; II定义一个基类指针if(_getch()='c')II如果输入一个小写字母 celsep=&child;/指向继承类对象p=&pare nt;/否则指向基类对象p-> Function 1();/这里在编译时会直接给出Pare nt:Fu nctio n1()的入口地址。p-> Fun cti on 2();/注意这里,执行的是哪一个Function2 ?return 0;编译并运行,输入一个小写字母c,得到用任意版本的 Visual C+或Borland C+F面的结果:This is pare nt,fu nct

5、i on1This is child,fu nctio n2为什么会有第一行的结果呢?因为我们是用一个Pare nt类的指针调用函数Fuction1(),虽然实际上这个指针指向的是Child类的对象,但编译器无法知道这一事实(直到运行的时候,程序才可以根据用户的输入判断出指针指向的对象),它只能按照调用Pare nt类的函数来理解并编译,所以我们看到了第一行的结果。那么第二行的结果又是怎么回事呢?我们注意到,Function2()函数在基类中被virtual关键字修饰,也就是说,它是一个虚函数。虚函数最关键的特点是动态联编”,它可以在运行时判断指针指向的对象,并自动调用相应的函数。如果我们在运

6、行上面的程序时任意输入一个非c的字符,结果如下:This is pare nt,fu ncti on1This is pare nt,fu ncti on2请注意看第二行,它的结果出现了变化。程序中仅仅调用了一个Function2()函数,却可以根据用户的输入自动决定到底调用基类中的Function2还是继承类中的Function2 ,这就是虚函数的作用。我们知道,在MFC中,很多类都是需要你继承的,它们的成员函数很多都要重载,比如编写MFC应用程序最常用的CView:OnDraw(CDC*)函数,就必须重载使用。把它定义为虚函数(实际上,在MFC中OnDraw不仅是虚函数,还是纯虚函数)可以

7、保证时刻调用的是用户自己编写的OnDraw。虚函数的重要用途在这里可见一斑。再看下面的上一篇:为何析构函数中的 cout不起作用 下一篇:菱形虚拟继承后,派生类的大小问题C+中虚函数和纯虚函数的概念,差别和分别存在的原因摘自:C+中虚函数和纯虚函数的概念,差别和分别存在的原因首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数定义他为虚函数是为了允许用基类的指针来调用子类的这个函数定义一个函数为纯虚函数,才代表函数没有被实现定义他是为了实现一个接口,起到一个规范的作用,规范继承这个 类的程序员必须实现这个函数。对继承的影响:普通的类(没有虚函数,纯虚函数)就可以被继承,而且工作的

8、相当好关于这个问题有以下疑问:纯虚函数难道就是为了实现接口?接口存在的意义?我实在弄不懂,我干嘛要预先定义好?未来的事情本难料就等有一天我的类中需要使用某个函数,在添加一个函数 不久可以?关于实例化一个类:有纯虚函数的类是不可能生成类对象的,如果没有纯虚函数则可以。比如:class CApublic:virtual voidfun()=0;/ 说明fun函数为纯虚函数virtual void fun 1();;class CBpublic:virtualvoidfun();virtualvoidfun 1();/ CA , CB类的实现voidmai n()CA a;/不允许,因为类 CA中有

9、纯虚函数CB b;/可以,因为类CB中没有纯虚函数虚函数在多态中间的使用:多态一般就是通过指向基类的指针来实现的。dog mydogwa ngwa ng;mydogwa ngwa ng.bor n();一定是返回“ dog”那么horse myhorsepipi;myhorsepipi.bor n();一定是返回 “ horse ”也是多态呀?/有一点你必须明白,就是用父类的指针在运行时刻来调用子类 例如,有个函数是这样的:void ani mal:fu n1(a ni mal*maybedog_maybehorse)maybedog_maybehorse->bor n();参数mayb

10、edog_maybehorse在编译时刻并不知道传进来的是dog类还是horse类,所以就把它设定为animal类,具体到运行时决定了才决定用那个函数。也就是说用父类指针通过虚函数来决定运行时刻到底是谁而指向谁的函数。/用虚函数#in elude<iostream.h>class ani malpublic:ani mal();ani mal();void fun 1(a ni mal*maybedog_maybehorse);virtual void born();voidani mal:fu n1(a ni mal*maybedog_maybehorse)maybedog_ma

11、ybehorse->bor n(); ani mal:a ni mal()an imal:a ni mal()voidani mal:bor n()cout<<"ani mal"class dog: public animalpublic:dog();dog();virtual void born();;dog:dog()dog:dog()voiddog:bor n()cout<<"dog"class horse:public animalpublic:horse();horse();virtual void born();

12、horse:horse()horse:horse()void horse:bor n()cout<<"horse"voidmai n()an imala;dog b;horse c;a.fu n1(&c);/output:horseIllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll不用虚函数#in elude <iostream.h>class ani malpublic:ani mal();ani mal();voidfun 1(a ni mal*maybedo

13、g_maybehorse);void born();voidani mal:fu n1(a ni mal*maybedog_maybehorse)maybedog_maybehorse->bor n(); ani mal:a ni mal()an imal:a ni mal()void ani mal:bor n()cout<< "ani mal"class dog: public animalpublic:dog();dog();void born();dog:dog()dog:dog()voiddog:bor n()cout<<"dog"class horse:public animalpublic:horse();horse();void born();horse:horse()horse:horse()voidhorse:bor n()cout<<"horse"void mai n()an imala;dog b;horse c;a.fu n1(&c);out

温馨提示

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

评论

0/150

提交评论