实验三多态与虚函数及运算符重载.docx

上传人:b****3 文档编号:3750583 上传时间:2022-11-25 格式:DOCX 页数:13 大小:238.53KB
下载 相关 举报
实验三多态与虚函数及运算符重载.docx_第1页
第1页 / 共13页
实验三多态与虚函数及运算符重载.docx_第2页
第2页 / 共13页
实验三多态与虚函数及运算符重载.docx_第3页
第3页 / 共13页
实验三多态与虚函数及运算符重载.docx_第4页
第4页 / 共13页
实验三多态与虚函数及运算符重载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验三多态与虚函数及运算符重载.docx

《实验三多态与虚函数及运算符重载.docx》由会员分享,可在线阅读,更多相关《实验三多态与虚函数及运算符重载.docx(13页珍藏版)》请在冰豆网上搜索。

实验三多态与虚函数及运算符重载.docx

实验三多态与虚函数及运算符重载

课程实验报告

课程名称

C++面向对象程序设计

班级

实验日期

2014.5.14~2014.5.25

姓名

学号

实验成绩

实验名称

实验三多态与虚函数及运算符重载

1.理解运算符重载的重要性并能灵活运用,分清哪些运算符可以重载,和单、双目运算符重载时参数的特点,参考课本例题。

2.掌握运算符重载的方法,能完整编写运算符重载成员函数并进行调用。

3.理解虚函数、纯虚函数,当需要动态调用派生类内的同名函数的时候应首先考虑虚函数。

硬件平台:

普通的PC机

软件平台:

Windows操作系统

编程环境:

VisualC++6.0,或DEV-cpp

1.编写一个时间类Time,包含时、分、秒等数据成员,实现时间的加、减、输入和输出操作。

其中加减通过重载相应运算符来实现。

2.设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,返回t1和t2两个三角形的面积之和。

3.分析一下程序错误,分析原因并改正。

4.下面的shape类是一个表示形状的抽象类,area()为求图形面积的函数。

请从shape类派生三角形类(Triangle)和圆类(circle),并给出具体的求面积函数。

#include

usingnamespacestd;

classshape

{

public:

virtualfloatarea()=0;

};

 

 

算法的描述:

1.这个题主要考察运算符的重载、构造函数的调用和类的对象的使用。

首先在Time类定义私有成员时分秒和公有成员函数,其中包括运算符的重载,其返回值为Time型;然后依次编写重载函数,需要根据时间加减是时、分、秒的进位算法,同时调用构造函数使得到的新数据可以直接返回;最后在主函数中编写界面和选项,在不同的选项中调用不同的函数,并使用显示函数输出结果。

2.这个题主要考察友元函数的使用以及类的对象的定义。

首先定义一个类,共有成员除了缺省构造函数,还包括一个求面积的函数和友元函数,友元函数用来返回面积之和;然后在主函数中定义类的对象,并给参数赋值,调用友元函数输出area。

3.这个题主要考察派生类基类成员函数的访问,此题中基类指针指向派生类对象只能访问基类的成员函数。

4.这个题主要考察使用虚函数,用基类的指针或基类的引用,可以动态调用派生类内同名area()的函数,以及以共有继承方式定义的派生类的编写。

首先定义shape类,公有成员函数为虚函数;然后分别编写三角形派生类和圆形派生类,派生类内分别包括三角形和圆形面积的算法;最后在主函数中定义一个shape型的指针变量,用来指向派生类的对象,同时使用显示函数输出面积。

2.

3.

 

4.

 

这四个实验主要考察了虚函数和运算符重载成员函数,应着重理解虚函数在什么情况下使用,在第一道题中,应注意重载函数的返回值为Time型,这样可以用时分秒的形式返回数据。

第二道题重点是重载运算符“+”,用来求两个三角形对象的面积之和,利用友元函数重载运算符“+”并返回面积之和。

第三题重点是派生类基类成员函数的访问,此题中基类指针指向派生类对象只能访问基类的成员函数,派生类等的共有成员函数和私有数据成员的访问一直是易错点,应特别注意。

第四题重点是虚函数用基类的指针或基类的引用,可以动态调用派生类内同名的函数,方便简洁并且提高效率。

我认为这一部分题目较为复杂,除了需要算法分析,还要仔细编写,确保思路清晰,同时灵活使用友元函数、虚函数、类的对象,尽可能使程序简化。

1.

#include

#include

usingnamespacestd;

classTime

{

private:

inthour,minute,second;

public:

Time(){}//缺省构造函数

Time(intshi,intfen,intmiao)//构造函数

{

hour=shi;

minute=fen;

second=miao;

}

Timeoperator+(TimeA);//运算符重载

Timeoperator-(TimeA);

voidshowtime();

};

voidTime:

:

showtime()

{

cout<

"<

"<

}

TimeTime:

:

operator+(TimeA)

{

second=A.second+second;

if(second>=60)

{

minute++;

}

second=second%60;

minute=A.minute+minute;

if(minute>=60)

{

hour++;

}

minute=minute%60;

hour=(A.hour+hour)%24;

returnTime(hour,minute,second);//调用构造函数,得到的新时间直接返回

}

TimeTime:

:

operator-(TimeB)

{

if(second

{

minute--;

}

second=(second-B.second)%60;

if(minute

{

hour--;

}

minute=(minute-B.minute)%60;

hour=(hour-B.hour)%24;

returnTime(hour,minute,second);

}

intmain()

{

inthour,minute,second;

TimeA,B;//定义两个Time类的对象

charch;

while

(1)

{

system("cls");

cout<<"a.inputtime"<

cout<<"b.addtime"<

cout<<"c.subtime"<

cout<<"pleaseinputyourchoice"<

cin>>ch;

if(ch=='a')

{

cout<<"pleaseinputtime"<

cin>>hour>>minute>>second;

A=Time(hour,minute,second);

A.showtime();

getch();

}

elseif(ch=='b')

{

cout<<"pleaseinputaddtime"<

cin>>hour>>minute>>second;

B=Time(hour,minute,second);

A=A+B;

A.showtime();

getch();

}

elseif(ch=='c')

{

cout<<"pleaseinputsubtime"<

cin>>hour>>minute>>second;

B=Time(hour,minute,second);

A=A-B;

A.showtime();

getch();

}

else

{

exit(0);

}

}

return0;

}

2.

#include

#include

#include

usingnamespacestd;

classTriangle

{

public:

Triangle(){}

Triangle(doublea,doubleb,doublec)

{

x=a;

y=b;

z=c;

}

doublearea()

{

doublew;

doublearea1;

w=(x+y+z)/2;

area1=sqrt(w*(w-x)*(w-y)*(w-z));

returnarea1;

}

frienddoubleoperator+(Trianglet1,Trianglet2)

{

returnt1.area()+t2.area();

}

private:

doublex,y,z;

};

intmain()

{

TriangleA(4.0,4.0,5.0),B(6.0,8.0,10.0);

cout<<"Theareais:

"<<(A+B)<

getch();

return0;

}

3#include

usingnamespacestd;

classA

{

public:

A(inti)

{

x=i;

}

virtualvoiddisp()

{

cout<<"x="<

}

private:

intx;

};

classB:

publicA

{

public:

B(inti,intj):

A(i)

{

y=j;

}

virtualvoiddisp()

{

cout<<"y="<

}

private:

inty;

};

intmain()

{

A*p,a

(1);

Bb(2,3);

p=&a;

p->disp();

p=&b;

p->disp();

return0;

}.

4.#include

#include

usingnamespacestd;

classshape

{

public:

virtualfloatarea()=0;

};

classtriangle:

publicshape

{

public:

triangle(){};

virtualfloatarea()

{

floatsum=0;

floatt=0;

t=(a+b+c)/2;

sum=sqrt(t*(t-a)*(t-b)*(t-c));

returnsum;

}

voidseta()

{

cout<<"请输入三角形第一条边a的值:

"<

cin>>a;

}

voidsetb()

{

cout<<"请输入三角形第二条边b的值:

"<

cin>>b;

}

voidsetc()

{

cout<<"请输入三角形第三条边的值:

"<

cin>>c;

}

private:

floata;

floatb;

floatc;

};

classcircle:

publicshape

{

public:

circle(){};

voidsetbanjing()

{

cout<<"请输入半径:

"<

cin>>banjing;

}

virtualfloatarea()

{

floatm=0;

m=3.14*banjing*banjing;

returnm;

cout<<"面积是:

"<

}

private:

floatbanjing;

};

voidfunc(shape&p)

{

cout<

}

voidmain()

{

trianglea;

circleb;

a.seta();

a.setb();

a.setc();

cout<<"三角形面积是:

";

func(a);

b.setbanjing();

cout<<"圆的面积是:

";

func(b);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1