赞
踩
实验内容及目的
实验目的:理解和掌握C++对象和类的继承和派生。
实验内容:在程序设计练习中,我们创建了一个MyPoint类来建模二维空间中的一个点。MyPoint类包含两个属性x和y,表示x轴和y轴的坐标,还包含x和y的获取器函数,及返回两点之间距离的函数。创建一个名为3DPoint的类,来建模三维空间中的一个点。将3DPoint设计为MyPoint的一个派生类,包含如下额外属性:
(1) 一个名为z的数据域,表示z轴坐标。
(2) 一个无参构造函数,创建一个坐标为(0,0,0)的点。
(3) 一个带参数的构造函数,按指定坐标创建一个点。
(4) z的获取器函数。
(5) 覆盖distance函数,返回三维空间中两点之间的距离。
(6) 一个名为getPerimeter()的函数,返回矩形的周长。
画出这两个类的UML图,实现类。编写一个测试程序,它创建两个点,坐标为(0,0,0)和(10,30,25.5),并输出两点之间的距离。
2 实验步骤
(1) 准备好2DMyPoint的有用的程序代码以作为框架
(2) 添加额外的域和方法,以及构造方法和要覆盖的方法声明
(3) 在主函数中实现上述声明的构造方法和普通方法
(4) 在Test3D.cpp源文件里创建MyPoint3D实例,然后通过创建的实例调用类覆盖的方法,测试该类的方法实现是否正确
3 源代码
#include <iostream>
#include <math.h>
using namespace std;
class MyPoint
{
public:
MyPoint();
MyPoint(double,double);
double getx();
double gety();
double distance(MyPoint);
double x,y;
};
class MyPoint3D:public MyPoint
{
public:
MyPoint3D();
MyPoint3D(double,double,double);
double getz();
double distance(MyPoint3D);
double z;
};
MyPoint::MyPoint()
{
x=0;
y=0;
}
MyPoint::MyPoint(double xx,double yy)
{
x=xx;
y=yy;
}
double MyPoint::getx()
{
return x;
}
double MyPoint::gety()
{
return y;
}
double MyPoint::distance(MyPoint c)
{
double n;
n=sqrt((x-c.getx())*(x-c.getx())+(y-c.gety())*(y-c.gety()));
return n;
}
MyPoint3D::MyPoint3D()
{
x=0;
y=0;
z=0;
}
MyPoint3D::MyPoint3D(double xx,double yy,double zz)
{
x=xx;
y=yy;
z=zz;
}
double MyPoint3D::getz()
{
return z;
}
double MyPoint3D::distance(MyPoint3D d)
{
double n;
n=sqrt((x-d.getx())*(x-d.getx())+(y-d.gety())*(y-d.gety())+(z-d.getz())*(z-d.getz()));
return n;
}
int main()
{
MyPoint3D d1;
MyPoint3D d2(10,30,25.5);
cout << "两点间的距离为:" << d1.distance(d2) << endl;
return 0;
}
4 遇到的问题与分析
本次实验,因为是扩展已有类而来,所以基本没有遇到什么问题,很顺利就得到了实验结果,在完成这次实验后,我分析了一下,这次实验顺利完成的原因,一方面,可以模仿已有类进行扩展,给我们实验带来了方便之处,另一方面,老师有条不紊的实验指导,也是这次实验能如此迅速完成的原因之一。
5 实验体会
通过本次实验,我更深入地理解了C++对象和类的继承与派生。因为这次实验,是在之前一个2DMyPoint类的基础上,把2D扩展成3D,当然,你可以重新写一个3D的类,这也可以实现要求,但理解了继承和派生以后,事情就变得非常简单了,只要让新的3D类继承2D类,然后再覆盖其distance函数,很快就完成了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。