实验三 多态性实验报告
- 格式:docx
- 大小:12.98 KB
- 文档页数:3
多态性实验报告一、实验目的本次实验的主要目的是深入研究和理解多态性这一重要的概念,并通过实际操作和观察来验证多态性在不同情境下的表现和作用。
二、实验原理多态性是面向对象编程中的一个关键特性,它允许不同的对象对相同的消息或操作做出不同的响应。
这种特性基于类的继承和方法的重写机制。
当一个父类的引用指向子类对象时,通过该引用调用方法时,实际执行的是子类中重写的方法,从而实现了多态性。
三、实验材料与环境1、编程语言:选择了 Java 作为实验的编程语言。
2、开发工具:使用了 IntelliJ IDEA 作为集成开发环境。
3、实验设备:一台配置良好的计算机,操作系统为 Windows 10。
四、实验步骤1、创建父类`Shape````javaclass Shape {public void draw(){Systemoutprintln("Drawing a shape");}}```2、创建子类`Circle` 和`Square` 继承自`Shape````javaclass Circle extends Shape {@Overridepublic void draw(){Systemoutprintln("Drawing a circle");}}class Square extends Shape {@Overridepublic void draw(){Systemoutprintln("Drawing a square");}}```3、在主函数中进行测试```javapublic class PolymorphismTest {public static void main(String args) {Shape shape1 = new Circle();Shape shape2 = new Square();shape1draw();shape2draw();}}```五、实验结果运行上述代码,输出结果为:```Drawing a circleDrawing a square```这表明,通过父类的引用调用`draw` 方法时,实际执行的是子类中重写的方法,实现了多态性。
一、实验目的1. 理解多态性的概念及其在面向对象编程中的重要性。
2. 掌握多态性的实现方式,包括方法重载和方法覆盖。
3. 学习如何利用多态性提高代码的可读性和可维护性。
4. 通过实例分析,加深对多态性在实际编程中的应用理解。
二、实验背景多态性是面向对象编程中的一个核心概念,它允许同一个接口(或方法)根据不同的数据类型执行不同的操作。
在Java、C++等面向对象编程语言中,多态性主要通过方法重载和方法覆盖来实现。
三、实验内容1. 方法重载方法重载是指在同一个类中,允许存在多个同名方法,但参数列表不同。
编译器通过参数列表的匹配来确定调用哪个方法。
(1)实验步骤1)创建一个名为“Animal”的类,包含一个方法名为“makeSound”。
2)在“Animal”类中,添加三个重载的“makeSound”方法,分别接受不同类型的参数(如int、String、double)。
3)创建一个名为“Dog”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“Woof! Woof!”。
4)创建一个名为“Cat”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“Meow! Meow!”。
(2)实验结果当创建“Dog”和“Cat”对象时,调用“makeSound”方法会根据对象类型输出相应的声音。
2. 方法覆盖方法覆盖是指在子类中重写父类的方法,使子类的方法具有与父类方法相同的签名,但具有不同的实现。
(1)实验步骤1)创建一个名为“Vehicle”的类,包含一个方法名为“move”,该方法无参数。
2)创建一个名为“Car”的类,继承自“Vehicle”类,并重写“move”方法,使其输出“Car is moving”。
3)创建一个名为“Bike”的类,继承自“Vehicle”类,并重写“move”方法,使其输出“Bike is moving”。
(2)实验结果当创建“Car”和“Bike”对象时,调用“move”方法会根据对象类型输出相应的移动信息。
多态性与虚函数实验报告实验目的:通过实验掌握多态性和虚函数的概念及使用方法,理解多态性实现原理和虚函数的应用场景。
实验原理:1.多态性:多态性是指在面向对象编程中,同一种行为或者方法可以具有多种不同形态的能力。
它是面向对象编程的核心特性之一,能够提供更加灵活和可扩展的代码结构。
多态性主要通过继承和接口来实现。
继承是指子类可以重写父类的方法,实现自己的特定行为;接口是一种约束,定义了类应该实现的方法和属性。
2.虚函数:虚函数是在基类中声明的函数,它可以在派生类中被重新定义,以实现多态性。
在类的成员函数前面加上virtual关键字,就可以将它定义为虚函数。
当使用基类指针或引用调用虚函数时,实际调用的是派生类的重写函数。
实验步骤:1. 创建一个基类Shape,包含两个成员变量color和area,并声明一个虚函数printArea(用于打印面积。
2. 创建三个派生类Circle、Rectangle和Triangle,分别继承Shape类,并重写printArea(函数。
3. 在主函数中,通过基类指针分别指向派生类的对象,并调用printArea(函数,观察多态性的效果。
实验结果与分析:在实验中,通过创建Shape类和派生类Circle、Rectangle和Triangle,可以实现对不同形状图形面积的计算和打印。
当使用基类指针调用printArea(函数时,实际调用的是派生类的重写函数,而不是基类的函数。
这就是多态性的实现,通过基类指针或引用,能够调用不同对象的同名函数,实现了对不同对象的统一操作。
通过实验1.提高代码的可扩展性和灵活性:通过多态性,可以将一类具有相似功能的对象统一管理,节省了代码的重复编写和修改成本,增强了代码的可扩展性和灵活性。
2.简化代码结构:通过虚函数,可以将各个派生类的不同行为统一命名为同一个函数,简化了代码结构,提高了代码的可读性和维护性。
3.支持动态绑定:通过运行时的动态绑定,可以根据对象的实际类型来确定调用的函数,实现了动态绑定和多态性。
实验3 多态性实验课程名:面向对象程序设计(C++)专业班级:09计科(一)班学号:2******** 姓名:***** 实验时间:12.6 实验地点:K4-102 指导教师:祁文青{cout<<"D::f3(double)"<<3*x<<endl;}};int main(){D d;B*pb=&d;D*pd=&d;pb->f1(1.23);pb->f1(1.23);pb->f2(1.23);pb->f3(1.23);pb->f3(3.14);return 0;}程序的运行结果。
答:2.编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现两个时间的相加。
要求将小时范围限制在大于等于0,分钟范围限制在0~59,秒钟范围限制在0~59秒。
【提示】时间类Time{public:Time(int h=0,int m=0,int s=0);Time operator+(Time&);void disptime(string);private:int hourse;cout<<s<<hourse<<":"<<minutes<<":"<<seconds<<endl;}int main(){int hh,mm,ss;do{cout<<"输入第一个时间时分秒(例如2 30 42)"<<endl;cin>>hh>>mm>>ss;}while(hh<0||mm<0||mm>59||ss<0||ss>59);Time t(hh,mm,ss);do{cout<<"输入第二个时间时分秒(例如2 30 42)"<<endl;cin>>hh>>mm>>ss;}while(hh<0||mm<0||mm>59||ss<0||ss>59);Time T(hh,mm,ss),t_total;t_total=t+T;t_total.disptime("输出结果(时/分/秒):");return 0;}程序运行结果:3.给出下面的抽象基类container;class container{protected:double radius;public:container(double radius1);virtual double surface_area()=0;virtual double volume()=0;};要求建立3个继承container的派生类cube、sphere与cylinder,让每一个派生类都包含虚函数surface_area()和volume(),分别用来计算正方体、球体和圆柱体的表面积及体积。
昆明理工大学信息工程与自动化学院学生实验报告(201 —201 学年第二学期)课程名称:C++程序设计开课实验室:年月日一、实验目的学习使用虚函数实现动态多态性。
二、实验任务定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。
观察虚函数的作用。
三、实验步骤编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。
在main()函数中定义vehicle、bicycle、motorcar、motorcycle的对象,调用其Run()、Stop()函数,观察其执行情况。
再分别用vehicle类型的指针来调用这几个对象的成员函数,看看能否成功;把Run、Stop定义为虚函数,再试试看。
程序代码:/******vehicle.cpp******/#include<iostream>using namespace std;class Vehicle{public:virtual run(){cout<<"Vehicle is running!"<<endl;}virtual stop(){cout<<"Vehicle is stopped!"<<endl;}};class Bicycle:virtual public Vehicle{public:run(){cout<<"Bicycle is running!"<<endl;}stop(){cout<<"Bicycle is stopped!"<<endl;}};class Motorcar:virtual public Vehicle{public:run(){cout<<"Motorcar is running!"<<endl;}stop(){cout<<"Motorcar is stopped!"<<endl;}};class Motorcycle:virtual public Bicycle,public Motorcar{public:run(){cout<<"Motorcycle is running!"<<endl;}stop(){cout<<"Motorcycle is stopped!"<<endl;}};void main(){/*Vehicle a;a.run();a.stop();Bicycle b;b.run();b.stop();Motorcar c;c.run();c.stop();Motorcycle d;d.run();d.stop();*/Vehicle *p;Vehicle a;p=&a;p->run();p->stop();Bicycle b;p=&b;p->run();p->stop();Motorcar c;p=&c;p->run();p->stop();Motorcycle d;p=&d;p->run();p->stop();}运行结果截图:1.在main()函数中定义vehicle、bicycle、motorcar、motorcycle的对象,调用其Run()、Stop()函数,其执行情况:2.分别用vehicle类型的指针来调用这几个对象的成员函数, 其执行情况:3.把Run、Stop定义为虚函数,其执行情况:。
实验三虚函数与多态、纯虚函数一.实验目的1. 在掌握继承与派生关系的基础上,进一步理解虚函数与多态性的关系,实现运行时的多态。
2. 学会定义和使用纯虚函数二、实验容1.例:了解"单接口,多方法"的概念。
现有称为figure的基类,存放了各二维对象(三角形、矩形和圆形三个类)的各维数据,set_dim()设置数据,是标准成员函数。
show_area()为虚函数,因为计算各对象的面积的方法是不同的。
【程序】#include < iostream >using namespace std;class figure{protected:double x,y;public:void set_dim(double i,double j=0){ x=i; y=j; }virtual void show_area(){ cout<<"No area computation defined for this class.\n";}};class triangle:public figure{void show_area(){ cout<<"Triangle with height "<< x<<" and base "<< y<<" has an area of "<< x*0.5*y<< endl;}};class square:public figure{public:void show_area(){ cout<<"Square with dimensions "<< x<<" and "<< y<<" has an area of "<< x*y<< endl;}};class circle:public figure{public:void show_area(){ cout<<"Circle with radius "<< x<<" has an area of "<<3.14159*x*x<< endl;}};int main(){figure *p;triangle t;square s;circle c;p->set_dim(10.0,5.0);p->show_area();p=&s;p->set_dim(10.0,5.0);p->show_area();p=&c; p->set_dim(10.0);p->show_area();return 0;}【要求】(1)建立工程,录入上述程序,调试运行并记录运行结果。
第1篇一、实验目的1. 理解多态性的概念和作用。
2. 掌握多态性的实现方法,包括方法重载、方法覆盖和构造函数重载。
3. 熟悉多态性在面向对象程序设计中的应用。
二、实验原理多态性是面向对象编程的一个重要特性,它允许同一操作作用于不同的对象上,产生不同的结果。
多态性主要分为两类:编译时多态和运行时多态。
1. 编译时多态:主要指方法重载,编译器在编译阶段就能确定调用哪个方法。
2. 运行时多态:主要指方法覆盖,在运行阶段才能确定调用哪个方法。
三、实验环境1. 操作系统:Windows 102. 开发工具:Java Development Kit (JDK) 1.83. 编译器:Eclipse四、实验步骤1. 创建一个父类`Animal`,包含一个抽象方法`makeSound()`和一个具体实现方法`makeSound()`。
2. 创建两个子类`Dog`和`Cat`,继承自`Animal`类,并分别重写`makeSound()`方法。
3. 在主类中创建一个`Animal`类型的数组,并初始化两个`Dog`对象和两个`Cat`对象。
4. 遍历数组,调用`makeSound()`方法,观察输出结果。
5. 创建一个`Animal`类型的引用,指向`Dog`对象,调用`makeSound()`方法,观察输出结果。
6. 创建一个`Animal`类型的引用,指向`Cat`对象,调用`makeSound()`方法,观察输出结果。
7. 修改`Animal`类中的`makeSound()`方法,增加一个参数,实现方法重载。
8. 在子类中重写`makeSound()`方法,增加一个新的参数,实现方法覆盖。
9. 在主类中创建一个`Animal`类型的引用,指向`Dog`对象,调用重载后的`makeSound()`方法,观察输出结果。
10. 在主类中创建一个`Animal`类型的引用,指向`Cat`对象,调用重载后的`makeSound()`方法,观察输出结果。
实验三多态与模板一、声明一个Shape抽象类,在此基础上派生出Rectangle和Circle类,二者都有GetArea ()和GetPerim()函数,GetArea用来计算对象的面积,GetPerim用来计算对象的周长。
封装上述各类,并编写测试程序。
Shape.h的内容:class Shape{public:Shape();virtual void GetArea();virtual void GetPerim();virtual ~Shape();};Shape.cpp的内容:#include "Shape.h"Shape::Shape(){}Shape::~Shape(){}void Shape::GetArea(){}void Shape::GetPerim(){}Circle.h的内容:#include "Shape.h"class CCircle : public Shape{public:virtual void GetPerim();virtual void GetArea();CCircle();virtual ~CCircle();private:float r;};Circle.cpp中的内容#include "Circle.h"#include "math.h"#include "iostream.h"CCircle::CCircle(){cout<<"请输入圆的半径:"<<endl;cin>>r;}CCircle::~CCircle(){cout<<"Thank you very much!";}void CCircle::GetArea(){ float s;float pi=3.14;s=pi*r*r;cout<<"这个圆形的面积是:"<<s<<endl;} void CCircle::GetPerim(){ float c;float pi=3.14;c=2*pi*r;cout<<"这个圆形的周长是:"<<c<<endl; } Rectangle.h中的内容:#include"Shape.h"class Rectangle: public Shape{private:float a,b;public:Rectangle();virtual void GetArea();virtual void GetPerim();virtual ~Rectangle();};Rectangle.cpp中的内容:#include "Rectangle.h"#include "math.h"#include "iostream.h"Rectangle::Rectangle(){ cout<<"请输入矩形的长和宽:"<<endl;cin>>a>>b;}Rectangle::~Rectangle(){ cout<<"Thank you very much!"<<endl;}void Rectangle::GetArea(){ float s;s=a*b;cout<<"这个矩形的面积是:"<<s<<endl;} void Rectangle::GetPerim(){ float c;c=a+a+b+b;cout<<"这个矩形的周长是:"<<c<<endl;} Shapetest.cpp中的内容:#include"Circle.h"#include"Rectangle.h"#include "iostream.h"int main(){ CCircle C;C.GetArea();C.GetPerim();Rectangle R;R.GetArea();R.GetPerim();return 0;}二、有一种栈,这种栈是按数组索引减小的方向增长的。
浙江理工大学信息学院实验指导书实验名称:类的多态性的实现学时安排:3实验类别:设计性实验实验要求:1人1组学号:姓名: ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄一、实验目的1.理解重载运算符的意义。
2.掌握使用成员函数、友员函数重载运算符的特点。
3.掌握重载运算符函数的调用方法。
4.掌握动态联编的概念。
5.掌握虚函数和纯虚函数的使用方法。
二、实验原理介绍设计性实验具体原理请见实验内容和步骤实现对抽象类的继承,通过operator函数调用的形式,实现运算符的重载三、实验设备介绍软件需求: windows或linux下的c++编译器硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。
四、实验内容某公司的员工有经理Manager、技术人员Technicist和营销人员SalsePerson,他们的薪金计算方法如下:经理按月计酬,方法是:基本工资+奖金;技术人员按月计酬,方法是:基本工资;营销人员按月计酬,方法是:基本工资+销售利润*5%。
每类人员都有职工编号、姓名、性别、入职时间、职位、基本工资等数据;各类人员使用统一接口get_pay()计算各类人员的月薪,重载<<运算符实现员工信息的输出。
其次,设计一个统计并输出该公司员工当月薪金情况的报表类Report,该类提供insert接口向Report类的容器中添加员工信息,并提供print接口用于展示以职位为单位的每个员工的职工编号、姓名、性别、入职时间以及当月该员工的薪酬,并统计出该职位员工薪酬的最高值和最低值。
为了提供更方便的查找功能,请为Report类重载[]运算符,下标值为职位,能根据职位信息查找出所有符合该职位的员工。
在主函数中对实现的类进行测试,首先,创建各类人员对象,通过Report类的insert接口向报表中添加这些人员信息,然后通过Report类的print接口输出当月员工薪酬情况报表。
计算机课程实验报告2012—2013学年度第一学期系别:数学与计算机科学学院image =image-other.image; retur n *this;}int{mai n ()COMPLEX c1(1,2)COMPLEX c2(2);}COMPLEXc3.pri nt ();c2.add(c1);c3. subs(c2);c3.pri nt();return 0;c3(c1)给出输出结果,分析this的用途■在此程序的基础上实现运算符” + ”和”的重载this是自身的地址,但是*this就是自身了■是按值回返了■如果函数的回返值是带有& 号的,那么回返值就是引用了构造出五个公共类函数,此函数在运行时没有出现问题,但是我经过仔细阅读理解程序的过程中,主要对这个this的用途和用法在网上查阅学习了下,一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用return *this ;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n )。
(2)运算符重载:以下程序要求实现运算符++的前置和后置重载,但实际上并没有实现试分析原因,并作出修改,以实现此功能。
#in elude <iostream.h>class OperClass{ int x;public:OperClass();OperClass operator ++();OperClass operator ++(int );void display();};OperClass:: OperClass( ) { x=0; return;}OperClass OperClass :: operator++() {OperClass A; ++x; A.x=x; return A;} OperClass OperClass :: operator++(int ) {OperClass 代x ++; A.x=x; return A;} void OperClass::display () { cout << “ x= “ <<x<<e ndl;void mai n ( ){OperClass X,Y ; X.display(); ++X;Y=++X;Y++.display();}内容2:重载<,>,==:设计字符串类String,用来存放不定长的字符串,重载运算符“==”,“>”,“<”, 用于两个字符串的大于、小于和等于的比较运算。
实验四 NaCl盐析法提DNA及HLA多态性分析一、实验目的(1)掌握盐析法提取DNA方法;(2)掌握PCR扩增HLA基因序列的方法;(3)了解HLA多态性。
二、实验原理(1)盐析法提取DNA原理DNA和蛋白质等其他成分在不同浓度的NaCl溶液中溶解度不同,利用这一特点选择适当的盐浓度就能使DNA充分溶解而使杂质沉淀或者相反以达到分离目的。
DNA在NaCl溶液中的溶解度先增大后减小,在DNA溶解度最低时DNA从溶液中析出,而其他杂质还留在溶液中达到粗提取的目的。
(2)PCR技术的原理在DNA聚合酶催化下,以母链DNA为模板,以特定引物为延伸起点,通过变性、退火、延伸等步骤,体外复制出与母链模板DNA 互补的子链DNA的过程。
是一项DNA体外合成放大技术,能快速特异地在体外扩增任何目的DNA。
三、实验材料(1)全血样品;NaCl;Tris-HCl;蛋白酶K;70%乙醇;无水乙醇;MgCl2;SDS;乙二胺四乙酸(EDTA);琼脂糖;PCR试剂。
四、操作方法DNA提取:1.新鲜抗凝全血或冻存抗凝全血0.5ml置于2ml离心管中,补3倍体积的红细胞裂解液(0.01mol/L Tris-HCL pH7.6; 0.01mol/L NaCl; 0.005mol/L MgCl2)混合,2500 rpm离心15 min,移去上清,再用同体积的红细胞裂解液两次裂解红细胞,沉淀用生理盐水洗涤1次,收集白细胞沉淀。
2.沉淀中加入150μl TE混匀,再加15μl 10% SDS及蛋白酶K 20μl,56℃消化过夜, 得到清亮粘绸的液体。
加入235μl 5mol/L NaCl,轻轻摇匀至少1min,5000rpm离心10min;3.将上清转至另一支1.5ml离心管中,加860μl无水乙醇颠倒摇动数次至DNA絮状析出,离心10000转/分,10分钟;4.加860μl冰冻70%乙醇混合去盐,12000rpm离心3min,弃上清,重复一次。
实验报告三继承和多态一、实验目的本实验的目的是熟练学习和掌握继承和多态并能灵活运用。
二、实验内容及结果(一)、题目的要求:设计基本几何图形的继承层次结构,并编程实现其中的主要类型,要求通过抽象方法、虚拟方法和重载方法来计算各种图形的面积和周长。
1、程序编程思路:首先定义一个shape类,然后通过抽象方法、虚拟方法和重载方法来计算各种图形(如圆和正方形)的面积和周长2、程序源码:static void Main(string[] args){Console.WriteLine("请输入圆的半径:");double r = double.Parse(Console.ReadLine());shape v1 = new circle(r);Console.WriteLine("该圆的周长为{0},面积为{1}",v1.length(),v1.area());Console.WriteLine("请输入正方形的边长:");double edge = double.Parse(Console.ReadLine());v1 = new square(edge);Console.WriteLine("该正方形的周长为{0},面积为{1}", v1.length(),v1.area());Console.ReadLine();}}public abstract class shape{public abstract double area();public abstract double length();}public class circle:shape{private double r;public double R{get { return r; }set { r = value; }}public override double area(){return Math.PI * Math.Pow(r, 2);}public override double length(){return Math.PI * 2 * r;}public circle(double r){this.r = r;}}public abstract class fouredge : shape{public override abstract double area(); public override abstract double length(); }public class square : fouredge{private double edge;public double Edge{get { return edge; }set { edge = value; }}public override double area(){return Math.Pow(edge, 2);}public override double length(){return 4*edge;}public square(double edge){this.edge = edge;}3、实验结果:二、实验效果对这个题目,要熟记抽象方法、虚拟方法和重载方法,掌握本章继承和多态的思想。
一、实验目的通过本次实验,加深对多态性的理解,掌握多态性的基本概念、实现方式以及在Java语言中的应用,提高面向对象编程的能力。
二、实验环境1. 操作系统:Windows 102. 开发工具:Eclipse3. 编程语言:Java三、实验内容1. 多态性基本概念多态性是指同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
在Java中,多态性主要表现在两个方面:方法重载和方法重写。
2. 方法重载方法重载是指在一个类中,允许存在多个名称相同、参数列表不同的方法。
编译器通过参数列表来区分这些方法,实现多态性。
(1)实验步骤1) 创建一个名为“Shape”的类,包含一个方法“draw()”,该方法不接受任何参数。
2) 在“Shape”类中添加三个方法:draw(String color),draw(String color, int size),draw(int x, int y)。
3) 创建一个名为“Circle”的类,继承自“Shape”类,并添加一个名为“draw”的方法,该方法接受一个int类型的参数radius。
4) 创建一个名为“Rectangle”的类,继承自“Shape”类,并添加一个名为“draw”的方法,该方法接受两个int类型的参数width和height。
5) 在主类中创建“Circle”和“Rectangle”对象,并调用它们的draw()方法。
(2)实验结果当执行程序时,根据传入的参数不同,调用不同的draw()方法。
3. 方法重写方法重写是指子类在继承父类的基础上,对父类的方法进行修改,实现多态性。
(1)实验步骤1) 创建一个名为“Animal”的类,包含一个名为“makeSound”的方法。
2) 创建一个名为“Dog”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“汪汪”。
3) 创建一个名为“Cat”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“喵喵”。
浙江理工大学信息学院
实验指导书
实验名称:类的多态性的实现学时安排:3
实验类别:设计性实验实验要求:1人1组
学号:姓名:
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
一、实验目的
1.理解重载运算符的意义。
2.掌握使用成员函数、友员函数重载运算符的特点。
3.掌握重载运算符函数的调用方法。
4.掌握动态联编的概念。
5.掌握虚函数和纯虚函数的使用方法。
二、实验原理介绍
设计性实验
具体原理请见实验内容和步骤
实现对抽象类的继承,通过operator函数调用的形式,实现运算符的重载
三、实验设备介绍
软件需求: windows或linux下的c++编译器
硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。
四、实验内容
某公司的员工有经理Manager、技术人员Technicist和营销人员SalsePerson,他们的薪金计算方法如下:
经理按月计酬,方法是:基本工资+奖金;技术人员按月计酬,方法是:基本工资;营销人员按月计酬,方法是:基本工资+销售利润*5%。
每类人员都有职工编号、姓名、性别、入职时间、职位、基本工资等数据;各类人员
使用统一接口get_pay()计算各类人员的月薪,重载<<运算符实现员工信息的输出。
其次,设计一个统计并输出该公司员工当月薪金情况的报表类Report,该类提供insert接口向Report类的容器中添加员工信息,并提供print接口用于展示以职位为单位的每个员工的职工编号、姓名、性别、入职时间以及当月该员工的薪酬,并统计出该职位员工薪酬的最高值和最低值。
为了提供更方便的查找功能,请为Report类重载[]运算符,下标值为职位,能根据职位信息查找出所有符合该职位的员工。
在主函数中对实现的类进行测试,首先,创建各类人员对象,通过Report类的insert接口向报表中添加这些人员信息,然后通过Report类的print接口输出当月员工薪酬情况报表。
存储员工对象的容器请选用合适的STL容器。
五程序清单
ormat("ddd")<<"\t";
cout<<(*it)->getbasicmoney()<<"\t"<<"\t";
cout<<(*it)->getpay(month) << endl;
}
}
void Report::insert(Employee* p)
{
(p);
}
Report::~Report(){
list<Employee*>::iterator it;
for(it = (); it != (); it ++){
delete *it;
}
}
double Technicist::getpay(int m){
return basicmoney;
}
double SalesPerson::getpay(int m){
return basicmoney + sales[m] * ;
}
//
//增加友元函数,重载<<
friend ostream &operator<<(ostream &os,CDate &date)
{
os<<<<"年"<<<<"月"<<<<"日"<<endl;
return os;
}
六运行结果
七实验心得
此次试验涉及内容较多,主要是多态和STL容器的运用,我了解并运用了vector、list、map容器,并使用了迭代器对容器元素进行访问,复习了重载、继承的知识。
在编程过程中也遇到了很多困难,比如怎样重载[]来找到所有并访问同一职务的人员的基本信息,比如怎样提取工资并对其进行大小比较,知道了不止一种方法执行此操作。
收获颇丰。