实验三 多态性实验报告
- 格式: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接口输出当月员工薪酬情况报表。
存储员工对象的容器请选用合适的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容器,并使用了迭代器对容器元素进行访问,复习了重载、继承的知识。
在编程过程中也遇到了很多困难,比如怎样重载[]来找到所有并访问同一职务的人员的基本信息,比如怎样提取工资并对其进行大小比较,知道了不止一种方法执行此操作。
收获颇丰。