C++暑期实习论文_第1页
C++暑期实习论文_第2页
C++暑期实习论文_第3页
C++暑期实习论文_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

.暑假实习论文C+中的多态性与虚函数专业班级:软件工程0701班学生姓名:XXX学生学号:XXX指导老师:周海二00八年七月十三日C+中关于多态性与虚函数的问题因为本学期C+期未考试考到了多态性与虚函数的问题,据悉答题准确率不高,而实训期间老师又讲到了多态性与函数的问题,故在此讲述一下本人对多态性与虚函数的理解,并举例说明。多态是指同样的消息被不同类型的对象接收时,可以导致完全不同的行为,它是在有虚函数的类中使用指向对象的指针时发生的。多态性是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征,它提供了接口与具体实现之间的另一层隔离,从而将“what”与“how”分离开来。多态性改善了代码的组织性和可读性,同时也使创建的程序具有可扩展性,程序不仅在项目的最初创建期可以“扩展”,而且当在项目需要有新的功能时也能“扩展”。面向对象的多态性可以分为重载多态、强制多态、包含多态和参数多态四类,多态从实现的角度可以划分为编译时的多态和运行时的多态两类,按照绑定进行阶段的不同又可以分为静态绑定和动态绑定两种。多态性主要体现在重写和重载两个方面,需要通过虚函数才能实现,虚函数为C+提供了更为灵活的多态机制。多态性允许在一个类的层次结构中加入新的子类和方法,而不必更改已经应用这个层次结构接口的应用程序。据了解,虚函数是动态绑定的基础。在C+中,虚函数可以是友元函数,但不能是静态成员。虚函数的重定义函数,无论是否使用virtual关键字,仍然是虚函数。虚函数经过派生之后,通过基类的指针,就可以使属于不同派生类的不同对象产生不同的行为,从而实现了运行时的多态。利用虚函数,可在基类和派生类中使用相同的函数名定义函数的不同实现,从而实现“一个接口,多种方式”。一般虚函数成员的声明语法如下: Virtual 函数类型 函数名(形参表)函数体例如:void Disp()coutMy name is name,and I teach cls classes.n;虚函数声明只能出现在类声明中的函数原型声明中,而不能在成员函数实现的时候出现。虚函数允许一个类型表达自己与另一个相似类型之间的区别,只要这两个类型都是从同一个基类派生的。这种区别是通过从基类调用的那些函数行为的不同来表达的。要注意的是,仅仅需要在基类中声明一个函数为virtual,调用所有匹配基类声明行为的派生类函数都将使用虚机制。虽然可以在派生类声明前使用关键字virtual(这也是无害的),但这样会使程序段显得冗余和混乱。另外,运行时多态需要满足三个条件:首先,类之间要满足赋值兼容规则;其次,要声明虚函数;最后,要由成员函数来调用或者是通过指针、引用来访问虚函数。对后两者我们都容易理解,对于类之间的赋值兼容规则我们可如是理解:基类对象的指针可以指向派生类对象;派生类的对象可以向基类的对象赋值;派生类的对象可初始化向基类的引用。C+语言还增加了纯的虚函数机制用来更好地设计包含多态性。对C+中多态性与虚函数的问题,还有很多方面的内容,这里仅对其中通过虚函数实现多态性进行了举例,烦请见谅。下面就C+中关于多态性与虚函数的问题对通过虚函数实现多态性这一语法要点进行举例说明。此例设计一个人员类Person,其中包含显示人员姓名的虚函数Disp(),然后派生出学生类Student和教授类Professor,最后在主函数中通过该虚函数实现多态性调用。声明了虚函数的源代码如附录所示,在Microsoft Visual Studio 2005中编译,调试运行可得如下结果:如果将Person类中的disp()函数前面的virtual去掉,则函数运行结果如下:可见,不使用虚函数便不能达到多态的效果。此外,代码编译过程中可能会遇到诸如:错误1error C2143: 语法错误 : 缺少“;”(在“*”的前面)e:07赵丽娟3901070118390107011807118.cpp错误2error C2334: “”的前面有意外标记;跳过明显的函数体e:07赵丽娟3901070118390107011807118.cpp的语法等错误提示而使编译失败,这些错误完全是因为我们的不细心所致,所以运行前要进行编译,并根据编译过程出现的错误提示对错误点进行修改。谨记:细节决定成败!附录(源代码):/07118.cpp#includeusing namespace std;class Personpublic:Person(char* s)name=new charstrlen(s)+1;strcpy(name,s);virtual void Disp()coutMy name is name.n; /声明虚函数protected:char* name;class Student:public Personpublic:Student(char* s,int g):Person(s),grade(g)void Disp()coutmy name is name,and my grade of Math is grade.n;private:int grade;class Professor:public Personpublic:Professor(char* s,int n):Person(s),cls(n)void Disp()coutMy name is name,and I teach clsDisp(); /将基类对象地址赋给基类指针

温馨提示

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

最新文档

评论

0/150

提交评论