ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:51.97KB ,
资源ID:14713519      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14713519.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(下载第五章多态性和虚函数解读.docx)为本站会员(b****5)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

下载第五章多态性和虚函数解读.docx

1、下载第五章多态性和虚函数解读实验四 多态性与虚函数一、 实验目的和要求1 了解多态性在C+中的体现;2 掌握虚函数的应用;3 了解抽象类。二、 基本概念 多态性 多态是指同样的消息被不同类型的对象接收时导致不同的行为,所谓消息是指对类的成员函数调用,不同的行为是指不同的实现,也就是调用了不同的函数。 多态性可以分为四类:重载多态、强制多态、包含多态和参数多态。 多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。编译时的多态性是在编译的过程中确定了同名操作的具体操作对象,也就是通过重载函数来实现的。运行时的多态性是在程序运行过程中才动态地确定操作所针对的具体对象,就是用虚函数来实现

2、的。 虚函数 虚函数是重载的另一种表现形式,它是一种动态的重载方式,它提供了一种更为灵活的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的“动态连接”。 一般虚函数成员的定义语法是: virtual 函数类型 函数名(形参表) 虚函数的定义实际就是在原有的普通函数成员前面使用virtual关键字来限定,虚函数声明只能出现在类定义中的函数原型声明中,而不能在成员的函数体中。 运行过程中的多态需要满足三个条件,首先类之间应满足赋值兼容规则,其二是要声明虚函数,第三是要由成员函数来调用或者是通过指针、引用来访问虚函数。抽象类抽象类是一种特殊的类,

3、它为一族类提供统一的操作界面。一个抽象类自身无法实例化,也就是说我们无法定义一个抽象类的对象,只能通过继承机制,生成抽象类的非抽象派生类,然后再实例化。 抽象类是带有纯虚函数的类。纯虚函数是一个基类中说明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类必须根据实际需要定义自己的版本,纯虚函数的声明格式为: virtual 函数类型 函数名(参数表)= 0;声明为纯虚函数之后,基类中就不再给出函数的实现部分,它的实现是在它的派生类定义的。对抽象类使用的几点规定如下:1 抽象类只能用作其他类的基类,不能建立抽象类对象;2 抽象类不能用作参数类型、函数返回类型或显式转换的类型;3 可以说明

4、指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性一般虚函数成员的定义语法是:virtual 函数类型 函数名(形参表)纯虚函数的声明格式为:virtual 函数类型 函数名(参数表)= 0;三、 程序例题例题4.1 有一个汽车类Vehicle,将它作为基类派生出小车类Car、卡车为类Truck和轮船类Boat,定义message( )函数用来显示各类信息。解:程序设计如下:(1)在基类汽车类Vehicle类中,定义一个虚函数message( ),用来显示信息;(2)在各个派生类中,重新定义message( )函数,以显示各自的信息;(3)在测试函数中,定义基类指针ptr,当它指

5、向不同的对象时,则执行不同对象所对应类的成员函数message( )。程序实现:#include class Vehicle /车辆类Vehicle定义 public: virtual void message( ) cout Vehicle messagen;private: int wheels; float weigth;/汽车类Car定义class Car: public Vehicle public: void message( ) cout Car messagen;private: int passenger_load;/卡车类Truck定义class Truck: public

6、 Vehicle public: void message( ) cout Truck messagen;private: int passenger_load; float payload;/轮船类Boat定义class Boat: public Vehicle int passenger_load;public: void message( ) cout message( ); /调用基类成员函数 ptr = &car; /将指针ptr指向Car类对象 ptr- message( ); /调用Car类成员函数 ptr = &truck; /将指针ptr指向Truck类对象 ptr- mes

7、sage( ); /调用Truck类成员函数 ptr = &boat; /将指针ptr指向boat类对象 ptr- messag( ); /调用Boat类成员函数程序运行结果:例4.2 从基类的图形类中派生出两个类。一个派生类是矩形类,在该类中,基类的x, y做作矩形的长和宽;另一个派生类是圆类,在该类中,新添加了成员是半径radius,半径的值等于x,y的坐标到原点的距离。程序实现:#include#includeclass Graph /定义一个图形基类 float x, y;public: Graph(float xx, float yy) x = xx; y = yy; float a

8、rea( ) return 0; ;class Rect: public Graph /由图形类派生出立方体 float length, width, high;public: Rect(float x, float y): Graph(x, y) length = x; width = y; float area( ) return length*width; ;class Circle: public Graph /由图形类派生出圆类 double radius;public: Circle(float x, float y): Graph(x, ) radius = sqrt(x*x+y

9、*y); double area( ) return 3.1416*radius*radius; ;void main( ) Graph s0(10, 10); Rect s1(10, 10); Circle s2(10, 10); cout 原面积= s0.area( ) endl; /调用基类的area( ) cout 矩形面积= s1.area( ) endl; /调用矩形的area( ) cout 圆的面积= s2.area( ) endl; /调用圆类的area( ) cout 面积=s2.Graph:area( ) endl; /调用基类的area( ) 程序运行结果为:在上题中,

10、虽然在这三个类中都有一个求面积的同名函数area( ),函数所带的参数也相同,但它们是属于不同的类。在编译时函数area( )就确定了其对象,各个对象调用其相应的函数,因此所得的结果也不同。这一点从上面的结果可以看出。例题4.3 修改上题的基类,将Graph类定义为抽象类,其他要求不变。解:程序具体设计如下:(1) 在抽象类Graph类中,定义两个纯虚函数Area( )和Display( )。(2) 在各派生类中,根据各自不同的要求,定义Area( )和Display( )函数的具体操作。(3)在主函数中,定义基类的指针数组ptr2,使它指向不同派生类的对象,以便在程序运行过程中,执行不同对象

11、所对应的类的成员函数。程序实现:#include #include class Graph /定义一个图形基类 double x, y;public: Graph(double xx, double yy) x = xx; y = yy; virtual double Area( )= 0; /纯虚函数 virtual void Display( )= 0; /纯虚函数 ;class Rect: public Graph /由图形类派生出立方体 double length, width;public: Rect(double x, double y): Graph(x, y) length =

12、 x; width = y; double Area( ) return length*width; void Display( ) cout 矩形面积=;class Circle: public Graph /由图形类派生出圆类 double radius;public: Circle(double x, double y): Graph(x, y) radius = sqrt(x*x+y*y); double Area( ) return 3.1416*radius*radius; void Display( ) cout 圆形面积=;void main( ) Graph *ptr2;;

13、/定义抽象类指针 Rect s1(10, 10); /矩形类对象 Circle s2(10, 10); /圆形类对象 ptr0 = &s1; /指针指向矩形类对象 ptr1 = &s2; /指针指向圆形类对象 int flag = 0, choice; while(flag!= 3) cout endl; cout 1. 矩形面积 endl; cout 2. 圆形面积 endl; cout 3. 退出 endl; cout choice; if(choice= =3) flag = 3; else if(choice = 1&choice Display( ); cout Area( ) en

14、dl; else cout 选择不在范围内,请重新选择。 endl; 程序运行结果: 例4.4 计算教师工资。教授类计算的是教授的工资,由该类派生出的讲师类计算的是讲师的工资。解:(1) 程序设计了一个类Professor,其成员函数Preliminary( )为虚函数,该函数用于计算教师的工资,Disp( )用于显示教师的收入。(2) 设计一个Prelector类,它是从Professor类派生的,其中的 Preliminary( )函数用于计算讲师的收入,这时的Disp( )用于显示讲师的收入。定义一个Print( )函数,通过传递参数的不同,可调用不同的显示函数。就是说,在执行Print

15、( )时,根据p对象的不同,自动确定调用相应的成员函数。 程序实现:#include class Professorprotected:int No;char name10;int f1, f2, f3, f;public:virtual void Preliminary( ) cout No;cout name;f1 = 2000;f2 = 500;f3 = 100;f = f1+f2-f3; void Disp( ) cout 基本工资: f1 endl;cout 岗位津贴: f2 endl;cout 实发工资: f endl; ;class Prelecto: public Profes

16、sorpublic:void Preliminary( ) cout No;cout name;f1 = 1500;f2 = 300;f3 = 80;f = f1+f2-f3; void Disp( ) cout 基本工资: f1 endl;cout 岗位津贴: f2 endl;cout 实发工资: f endl; ;void Print(Professor & p) p.Preliminary( );p.Disp( );void main( ) Professor p1;Prelector p2;cout 教授的工资: endl;Print(p1); /计算教授的工资cout 讲师的工资:

17、endl;Print(p2); /计算讲师的工资程序运行结果: 例题4.5 程序设计了一个抽象类图形类,由这个抽象类派生出矩形、圆形和三角形三个类。在抽象类中定义了公共数据x、y,这两个数据可作为矩形的长和宽;两数据平方和的平方根用作圆的半径,两数据还作三角形的底边和高。解:具体设计如下:(1) 在抽象类图形类中,定义两个纯虚函数,一个是Area( )用于求各种图形面积;另一个是Disp( )函数,用于显示结果。它们的实现在派生类中完成。(2) 在各个派生类中,写出Area( )和Disp( )函数的具体算法。(3) 在主函数中定义一个基类指针数组,由它指向各派生类对象,通过这个指针可调用各类

18、的Area( )和Disp( )函数版本,从而体现了多态性。程序实现:#include #include class Shape /定义Shape抽象类protected: /保护成员,其派生类可以访问double x, y; public:void Setvalue(int m, int n)x = m;y = n;virtual float Area( )= 0; /定义纯虚函数virtual void Disp( )= 0; /定义纯虚函数;class Rectangle: public Shape /定义矩形派生类 double sr;public:float Area( ) /虚函数

19、在矩形类中的定义版本sr = x*y;return 1;void Disp( ) cout 矩形面积= sr endl;class Circle: public Shape /定义圆的派生类 double sc;public:float Area( ) /虚函数在圆类中的定义版本 sc = 3.14*sqrt(x*x+y*y);return 1; void Disp( ) cout 圆的面积= sc endl; ;class Triangle: public Shape /定义三角形派生类 double st;public:float Area( ) /虚函数在三角形类中的定义版本 st =

20、x*y/2;return 1; void Disp( ) cout 三角形: st endl;void main( ) Rectangle r; /定义矩形类对象 Circle c; /定义圆类对象 Triangle t; /定义三角形对象int x, y; int choice; /用来接收所选择的选项号 Shape *p3; /定义抽象类指针数组 p0 = new Rectangle; /将指针p0指向矩形类对象 p1 = new Circle; /将指针p1指向圆类对象 p2 = new Triangle; /将指针p2指向三角形对象 do /循环选择选项 cout 1.求矩形面积n;

21、/显示选择菜单 cout 2.求圆的面积n; cout 3.求三角形面积n; cout 0.退出n; cout choice; /输入选项号 if(choice = 1& choice = 3) cout x y; /输入x,y的值 pchoice-1- Setvalue(x, y); /根据choice值决定调用哪 pchoice-1- Area( ); /调用成员函数 pchoice-1- Disp( ); cout n;while(choice!= 0);程序运行结果: 四 实验题目1 定义一个图形类为抽象类,其具有求对象的面积和周长等基本功能(Area(), Perim(),在此基础上

22、派生出圆形、三角形和矩形,分别求出它们的周长和面积。2 设计一个程序,该程序能找出优秀学生(成绩在90分以上)和优秀教师(发表论文3篇以上)。当输入一系列学生或教师的记录后(姓名、成绩),将他们中优秀的人的姓名输出来。3 定义一个基类为哺乳动物类Mammal,其中有数据成员年龄、重量、品种,有成员函数move( )、speak( )等,以此表示动物的行为。由这个基类派生出狗、猫、马、猪等哺乳动物,它们有各自的行为。编程分别使各个动物表现出不同的行为。要求如下:(1) 从基类分别派生出各种动物类,通过虚函数实现不同动物表现出的不同行为。(2) 今有狗CAIRN:3岁,3kg;DORE:4岁,2kg;猫CAT:2岁,4kg;马:HORSE,5岁,60kg;猪:PIG,2岁,45kg。(3) 设置一个Mammal类数组,设计一个屏幕菜单,选择不同的动物或不同的品种,则显示出动物相对应的动作,直到选择结束。(4) 对应的动作中要先显示出动物的名称,然后显示年龄、重量、品种、叫声及其他特征。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2