搜档网
当前位置:搜档网 › 《计算机基础实验课程》实验五 多态

《计算机基础实验课程》实验五 多态

《计算机基础实验课程》实验五  多态
《计算机基础实验课程》实验五  多态

院系:计算机学院

实验课程:计算机基础实验课程

实验项目:多态

指导老师: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)在以后的编程中,尽量是程序简单明了,运行出来的界面让人一目了然。

相关主题