- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
105032013006_实验6多态和虚函数.doc.doc
实验6 多态和虚函数
一、实验目的
1. 掌握虚函数的定义与使用方法。
2. 通过观察虚函数实现的多态性,理解程序运行过程中的动态多态性。
3. 掌握纯虚函数与抽象类的设计和使用方法。
二、实验要求
1. 设计、调试、测试程序,分析实验结果,总结经验和体会。
2. 学习调试程序的方法,特别注意如何跟踪/单步运行、观察变量的值。
(1)将源文件编译之后,按F10进入main()函数,不断按F10单步跟踪。监视框观察变量信息的变化。不想观察了,按F5(或Ctrl+F5)执行完程序。
(2)按F11进入子函数,观察框中可输入变量名观察,不断按F10单步跟踪。
(3)将光标移到某一行,按F9,就在这行设置了断点;按F5执行程序,观察程序的运行停到了这一行。按F10继续单步执行程序。
三、实验任务
1. 将给定程序编译,再按F10进入main()函数单步运行,并回答实验报告(列于后面)中的问题。
2. 模仿例子程序进行改编设计或独立设计。
附:实验报告
学 号105032013006姓 名李博韬专业、班计本一班实验地点理工楼1-指导教师王开军时 间2015.5.13实验6 多态和虚函数
一、实验目的及要求
1. 掌握虚函数的定义与使用方法。
2. 观察通过虚函数实现的多态性,理解程序运行过程中的动态多态性。
3. 掌握纯虚函数与抽象类的设计和使用方法。
二、实验内容与步骤
实验方法:学生首先运行源代码,不断按F10 / F11单步跟踪,搞懂相关概念和方法;然后模仿例子代码,添加或改写类似代码,调试运行。
1. 如何通过虚函数实现多态性?源代码exp6_1.cpp
答:① 在基类中定义虚函数,同时在派生类中重新定义与该虚函数同名的虚函数;② 在主函数中声明基类指针(或引用);③ 主函数中,用该指针指向基类对象(存储基类对象的地址)时,接着用该指针调用该虚函数(系统自己会调用基类的);④ 主函数中,用该指针指向派生类对象(存储派生类对象的地址)时,接着用该指针调用虚函数(系统自己会调用派生类的)。这样就实现了多态性(即同名函数的调用却实现不同的功能/行为)。
(1) 认识虚函数
● 哪些是虚函数?什么时候可???省略关键词?
用关键词virtual声明的成员函数Area()。
基类中的成员函数被声明为虚函数后,派生类中的同名函数自动成为虚函数,可省略关键字。
● 共有几个虚函数?分别在哪些类中?它们的定义(具体代码)相同吗?
共有三个虚函数,分别在Shape,Circle,Rectangle类中,它们的定义不同,派生类对基类的虚函数重新定义。
(2) 类外(例如普通函数、对象)调用虚函数
● 普通函数CalcArea能直接调用类的虚函数吗?
不能。
● 普通函数CalcArea是怎么访问类的虚函数的?
形参是基类Shape的引用,可以。
● 函数CalcArea中,都是基类Shape的对象s调用其虚函数s.Area()的。那又是怎么实现CalcArea(a)是调用a的Area(),而CalcArea(b)是调用b的Area()?
通过基类引用调用基类的虚函数Area()时,编译系统会根据该引用的对象调用该对象的同名函数Area()。
(3) 通过基类指针(或引用)访问基类和派生类中的同名函数
● 主函数中p是什么(详细说明)?p = a; 是什么含义?
p是基类Shape的指针,将对象a的地址存到p中。
● Shape类型的指针p,为什么能存放Circle类型的对象a的地址(p = a;)?
继承机制允许这么做,基类类型的指针可以指向派生类的对象。
● 主函数中coutp-Area()是调用哪个(类)对象的虚函数Area()?
调用Circle类的虚函数Area()。
2. 如何通过纯虚函数和抽象类实现多态性? 源代码exp6_2.cpp
(1) 理解纯虚函数和抽象类
● 你能在哪个类中找到纯虚函数,什么样的虚函数是纯虚函数?
Shape类中的Area()是纯虚函数,纯虚函数没有实现代码。
● 如何判断一个类是抽象类?
类中包含纯虚函数的类是抽象类。
● 能创建抽象类的实例(对象)吗?
不能。
(2) 派生类对象的动态创建
● 主函数中Circle对象a能访问其保护成员cR吗?紧接着Circle *q=a; 行下面,用代码x=a.cR; 试一下,再用代码x=q-cR; 试一下。
不能,只能访问对象的公有成员。
● 主函数中语句q=new Circle(2.0); 是动态创建了派生类Circle的对象吗?你能提供该对象存在的证据吗?该对象保存在哪?
是。在观察窗口可以看到指针q所指向
文档评论(0)