当前位置:
搜档网 › 《计算机基础实验课程》实验五 多态
《计算机基础实验课程》实验五 多态
院系:计算机学院
实验课程:计算机基础实验课程
实验项目:多态
指导老师:XXX
开课时间:XXXX~ XXXX年度第 2学期专业:XXXX
班级:XXXX级本X班
学生:XXX
学号:XXXXXXXX
一、实验目的与要求:
1.掌握运算符重载的基本方法。
2.掌握虚函数的定义及多态性的实现。
二、实验内容:
(一)实验题目一:
编写有理数(即分数,包括整数类型的分子和分母)类,并进行运算符重载,编写运算符“+”、“-”、“*”、“/”的重载函数,在主函数的函数体内中实现使用运算符直接进行有理数对象的加、减、乘、除运算。
1.程序清单:
#includ e
using namespace std;
class Rnumber
{
public:
Rnumber(){a=0;b=0;}
Rnumber(int,int);
Rnumber operator +(Rnumber &);
Rnumber operator -(Rnumber &);
Rnumber operator *(Rnumber &);
Rnumber operator /(Rnumber &);
void display();
private:
int a;
int b;
};
Rnumber::Rnumber(int x,int y):a(x),b(y){}
Rnumber Rnumber::operator +(Rnumber & x)
{
int i;
i=(a>x.a)?a:x.a;
for(;i!=0;i++)
{
if(i%b==0 && i%x.b==0)
break;
}
return Rnumber(i/b*a+i/x.b*x.a,i);
}
Rnumber Rnumber::operator -(Rnumber & x) {
int i;
i=(a>x.a)?a:x.a;
for(;i!=0;i++)
{
if(i%b==0 && i%x.b==0)
break;
}
return Rnumber(i/b*a-i/x.b*x.a,i);
}
Rnumber Rnumber::operator *(Rnumber & x) {
return Rnumber(a*x.a,b*x.b);
}
Rnumber Rnumber::operator /(Rnumber & x) {
return Rnumber(a*x.b,b*x.a);
}
void Rnumber::display()
{
int n;
n=(a
for(;n>1;n--)
{
if(a%n==0 && b%n==0)
{
a=a/n;
b=b/n;
}
}
cout<}
int main()
{
Rnumber a1(3,5),a2(3,4),a3,a4,a5,a6;
a3=a1+a2;
a4=a1-a2;
a5=a1*a2;
a6=a1/a2;
cout<<"a1=";
a1.display();
cout<<" a2=";
a2.display();
cout<cout<<"a1+a2=";
a3.display();
cout<cout<<"a1-a2=";
a4.display();
cout<cout<<"a1*a2=";
a5.display();
cout<cout<<"a1/a2=";
a6.display();
cout<return 0;
}
2. 程序运行结果:
(二)实验题目二:
BaseRun类定义如下:
class BaseRun
{ public:
void Run(){cout<<〝\n…………class BaseRun::Run()……\n〞;} };
定义DogRun,CarRun和PeopleRun类,都继承自BaseRun类,并重载Run()函数,使各类中的Run()函数分别输出不同的内容。
1.程序清单:
#include
using namespace std;
class BaseRun
{
public:
void Run()
{
cout<<"\n……class BaseRun::Run()……\n";
}
};
class DogRun:public BaseRun
{
public:
void Run()
{
cout<<"\n……class DogRun::Run()……\n";
}
};
class CarRun:public BaseRun
{
public:
void Run()
{
cout<<"\n……class CarRun::Run()……\n";
}
};
class PeopleRun:public BaseRun
{
public:
void Run()
{
cout<<"\n……class PeopleRun::Run()……\n";
}
};
void main()
{
BaseRun BR;
DogRun DR;
CarRun CR;
PeopleRun PR;
BR.Run();
DR.Run();
CR.Run();
PR.Run();
cout<}
2.程序运行结果:
(三)实验题目三:
将BaseRun:: Run()函数声明成虚函数,用基类指针分别指向派生类对象,并通过基类指针调用派生类对象的Run()函数,体会继承中的多态性。
1.程序清单:
#include
using namespace std;
class BaseRun
{
public:
virtual void Run()
{
cout<<"\n……class BaseRun::Run()……\n";
}
};
class DogRun:public BaseRun
{
public:
void Run()
{
cout<<"\n……class DogRun::Run()……\n";
}
};
class CarRun:public BaseRun
{
public:
void Run()
{
cout<<"\n……class CarRun::Run()……\n";
}
};
class PeopleRun:public BaseRun
{
public:
void Run()
{
cout<<"\n……class PeopleRun::Run()……\n";
}
};
void main()
{
BaseRun *pt;
BaseRun BR;
DogRun DR;
CarRun CR;
PeopleRun PR;
pt=&BR; pt->Run();
pt=&DR; pt->Run();
pt=&CR; pt->Run();
pt=&PR; pt->Run();
cout<}
2.程序运行结果:
三、实验小结:
1. 出现问题分析:
(1)对于实验一中的加减乘除的运算功能的较难实现;当生成新的有理数(分数)时,还要考虑是否为最简形式。
(2)对于实验二中重载函数的调用,和实验三中用基类指针实现对同名函数的调用都是难点。
2.解决方法:
(1)对于加减乘除的运算,根据其不同的运算法则(如乘法直接使分子分母各自相乘),得出初步结果,再将该分数进行化简。
(2)重载函数由不同类的对象进行调用,对于基类中定义了虚函数,只需要定义基类指针进行,然后每次分别指向不同类的对象,再调用函数。
3. 经验教训:
(1)对于类的多态性的内容,以后要多加练习。而且自己要熟练掌握函数
承载、运算符承载等内容,做到有的放矢。
(2)在以后的编程中,尽量是程序简单明了,运行出来的界面让人一目了然。