一、要求
【项目:点-圆-圆柱类族的设计】按以下的提示,由基类的设计和测试开始,逐渐地完成各个类的设计,求出圆格柱体的表面积、体积并输出并且完成要求的计算任务:
先建立一个Point(点)类,包含数据成员x,y(坐标点),实现需要的成员函数,并设计main函数完成测试
以Point为基类,派生出一个Circle(圆)类,增加数据成员r(半径),以及求面积的成员函数area,实现其他需要的成员函数,设计main函数完成测试
再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高),以及求圆柱表面积的成员函数area和求圆柱体积的成员函数volume,实现需要的成员函数,并设计main函数完成测试
【要求】:
编写程序,设计出各类中“需要的成员函数”,包括构造函数、析构函数、修改数据成员和获取数据成员的公共接口等。(提示:此任务可以分为三个子任务分成若干步骤进行。先声明基类,再声明派生类,逐级进行,分步调试。——这种方法适用于做任何的项目)
二、分析
首先分析三个类的关系,Point类中成员函数有x,y。Circle类继承Point类,新增成员r,Cylinder类继承Circle类,新增成员h,分别在三个类中编写无参构造与有参构造,可以使用初始化列表新建对象,之后分别编写set与get函数设置、获取成员的值。Circle类中编写虚构函数virtual double area()获取圆的面积,并在Cylinder类中对其重写,另外,在Cylinder中为圆柱体编写计算体积的函数double volume()
三、代码
💻提示:所有实验源码已在github整理
#include <iostream> using namespace std; #define PI 3.1415926
class Point { public: Point() {}; Point(double px, double py) { this->px = px; this->py = py; } void setpx(double px) { this->px = px; } void setpy(double py) { this->py = py; } double getpx() { return px; } double getpy() { return py; } double px; double py; };
class Circle :public Point { public: Circle() {}; Circle(double r, Point p) { this->r = r; px = p.getpx(); py = p.getpy(); } Circle(double x, double y, double r) { this->r = r; px = x; py = y; } void setR(double r) { this->r = r; } double getR() { return r; } virtual double area() { return PI * r*r; } double r; };
class Cylinder :public Circle { public: Cylinder(double h, Circle c) { this->h = h; r = c.getR(); px = c.px; py = c.py; } void seth(double h) { this->h = h; } double geth() { return h; } double area() { return 2 * PI*r*r + PI * 2 * r*h; } double volume() { return PI * r*r*h; } double h; }; int main() { Point p(0, 0); cout << "测试Point类 p(" << p.getpx() << "," << p.getpy() << ")" << endl;
Circle c1(2, p); cout << "测试Circle类 c1的半径 " << c1.getR() << " 坐标(" << c1.getpx() << "," << c1.getpy() << ") 面积为 " << c1.area() << endl; c1.setpx(10); c1.setpy(10); c1.setR(10); cout << "测试Circle类 set函数 半径 " << c1.getR() << " 坐标(" << c1.getpx() << "," << c1.getpy() << ")" << endl;
Circle c2(0, 0, 2); cout << "测试Circle类 c2的半径 " << c2.getR() << " 坐标(" << c2.getpx() << "," << c2.getpy() << ") 面积为 " << c2.area() << endl;
Cylinder * cy = new Cylinder(1, c1); cout << "测试Cylinder类 cy的半径 " << cy->getR() << " 坐标(" << cy->getpx() << "," << cy->getpy() << ") 面积为 " << cy->area() << " 体积为 " << cy->volume() << " 高为" << cy->geth() << endl; cy->seth(10); cy->setpx(10); cy->setpy(10); cy->setR(10); cout << "测试Cylinder类 set函数 半径 " << cy->getR() << " 坐标(" << cy->getpx() << "," << cy->getpy() << ") 高为" << cy->geth() << endl; delete cy; system("pause"); return 0; }
|
四、 结果



纯虚析构虽然优化了代码,但是有了纯虚析构之后,这个类也属于抽象类,无法实例化对象。所以在编写多态与继承时,要分清各个类中成员函数与成员之间的关系