实验三多态与虚函数及运算符重载.docx
《实验三多态与虚函数及运算符重载.docx》由会员分享,可在线阅读,更多相关《实验三多态与虚函数及运算符重载.docx(13页珍藏版)》请在冰豆网上搜索。
![实验三多态与虚函数及运算符重载.docx](https://file1.bdocx.com/fileroot1/2022-11/25/c63a26c6-a9ca-47a5-bf75-880fce2fd4de/c63a26c6-a9ca-47a5-bf75-880fce2fd4de1.gif)
实验三多态与虚函数及运算符重载
课程实验报告
课程名称
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);