实验目的与要求:
1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。 2.掌握派生类构造函数初始化基类成员和对象成员的方法。 3.掌握内联函数和默认函数。 4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。实验过程及内容:
实践教程实验二十二 P81 范例:定义一个继承与派生关系的类体系,在 派生类中访问基类成员。 ① 先定义一个点类,包含 x,y 坐标数据成员,显示函数和计算面积的函数 成员; ② 以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面 积的函数; ③ 定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度 函数,线段类采用聚合方式,因为有两个端点,不能用派生。 编程测试所定义的类体系。 本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念 及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。 2. 实践教程 P83 编程:多层派生练习,由上题 Point 类和 Circle 类继续派生 出 Cylinder 类。要求计算圆柱的底面积、侧面积、全面积和体积。 请编写所有完整的成员函数,并编写主函数进行验证。数据处理 1. (1)
1.
(2)j 结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。 (3)在 Line 类中添加两个数据成员。
2. #include <iostream> #include <cmath> using namespace std; #define PI 3.14159 class Point{ friend class Line; protected: double x, y ; public: Point(){x = 0 ; y = 0 ; } Point(double xv,double yv){ x = xv; y = yv; } double Area(){return 0;} void Show() { cout<<"x="<<x<<' '<<"y="<<y<<endl; } }; class Circle :public Point{ protected: double radius; public: Circle(){ x = 0; y = 0; radius = 0; } Circle(double xv,double yv,double vv):Point(xv,yv){ //调用基类构造函数 radius = vv; } Circle(Circle & cir):Point(cir){ //按赋值兼容规则 cir 可为 Point 实参 radius=cir.radius; } Circle & operator=(Circle & cir){ this->Point::operator=(cir); //在派生类中定义重载的拷贝赋值操作符有固定的 标准格式 radius=cir.radius; return *this; } double Area(){ return PI*radius*radius; } void Show() cout<<"x="<<x<<' '<<"y="<<y<<" radius="<<radius<<endl; //访问基类的数据成 员 } }; class Cylinder:public Circle { double high; public:
Cylinder(){ x = 0; y = 0; radius = 0;high=0; } Cylinder(double xv,double yv,double vv,double kv):Circle(xv,yv,vv){ //调用基类构造 函数 high=kv; } Cylinder(Cylinder & cyl):Circle(cyl){ //按赋值兼容规则 cyl 可为 Cylinder 实参 high=cyl.high; } Cylinder & operator=(Cylinder & cyl){ this->Circle :: operator=(cyl); //在派生类中定义重载的拷贝赋值操作符有固定 的标准格式 high=cyl.high; return *this; } double ceArea(){ return 2*PI*radius*high; } double
quArea(){ return ceArea()+2* Area(); } double volume(){ return Area()*high; } void Show(){ cout<<"x="<<x<<' '<<"y="<<y<<' '<<"radius="<<radius<<' '<<"high="<<high<<endl; //访问基类的数据成员 }; class Line{ Point start,end; //对象成员 public: Line(){} //对象成员初始化 Line(double xv1,double yv1,double xv2,double yv2) : start(xv1,yv1),end(xv2,yv2){ } double GetLength() { return sqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y)); } double Area(){return 0;} void Show(){ cout<<"start point:\n"; start.Show(); cout<<"end point:\n"; end.Show(); } };
int main(){ Point pt(0,0); Circle cl1(100,100,10),cl2(cl1),cl3; Cylinder h1(50,50,20,30),h2(h1),h3; Line ln1(0,0,100,100),ln2; cout<<"点面积:"<<pt.Area()<<endl; pt.Show(); cout<<"cl1 圆面积:"<<cl1.Area()<<endl; cl1.Show(); cout<<"cl2 圆面积:"<<cl2.Area()<<endl; cl2.Show(); cl3=cl1; cout<<"cl3 圆面积:"<<cl3.Area()<<endl; cl3.Show(); cout<<"h1 底面积:"<<h1.Area()<<endl; cout<<"h1 侧面积:"<<h1.ceArea()<<endl; cout<<"h1 全面积:"<<h1.quArea()<<endl; cout<<"h1 体积:"<<h1.volume()<<endl; h1.Show(); cout<<"h2 底面积:"<<h2.Area()<<endl; cout<<"h2 侧面积:"<<h2.ceArea()<<endl; cout<<"h2 全面积:"<<h2.quArea()<<endl; cout<<"h2 体积:"<<h2.volume()<<endl; h2.Show(); h3=h1; cout<<"h3 底面积:"<<h3.Area()<<endl; cout<<"h3 侧面积:"<<h3.ceArea()<<endl; cout<<"h3 全面积:"<<h3.quArea()<<endl; cout<<"h3 体积:"<<h3.volume()<<endl; h3.Show(); cout<<"线面积:"<<ln1. Area()<<'\t'<<"线长度:"<<ln1. GetLength()<<endl; ln1.Show(); ln2.Show(); return 0; }
实验结论: 通过这次实验,我对类的继承和派生,派生类构造函数初始化基类成员和 对象成员的方法,以及赋值兼容原则有了更深的理解。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。