实验三多态与虚函数及运算符重载.docx
- 文档编号:3750583
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:13
- 大小:238.53KB
实验三多态与虚函数及运算符重载.docx
《实验三多态与虚函数及运算符重载.docx》由会员分享,可在线阅读,更多相关《实验三多态与虚函数及运算符重载.docx(13页珍藏版)》请在冰豆网上搜索。
实验三多态与虚函数及运算符重载
课程实验报告
课程名称
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);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 多态与虚函数及运算符重载 实验 函数 运算 重载