用C++编写一个程序满足已知Point(点)类,点类的公有派生类Circle(圆)类,圆类的公有派生Cylinder(圆柱体)类如下: class Point { public: virtual double area() { return 0; } }; class Circle:public Point { protected: double m_radius; public: Circle(double r); virtual double area(); }; class Cylinder:public Circle { private: double m_high; public: Cylinder(double r, double h); virtual double area(); }; 试完成成员函数的定义,在主函数中输入圆的半径和圆柱的高,利用指向基类的指针,分别输出圆的面积和圆柱体的表面积。 输入 2个数,分别代表圆的半径和圆柱的高。 输出 圆的面积和圆柱体的表面积(取2位小数)。
时间: 2023-06-18 09:06:54 浏览: 150
以下是完整程序:
```cpp
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
class Point {
public:
virtual double area() { return 0; }
};
class Circle : public Point {
protected:
double m_radius;
public:
Circle(double r) : m_radius(r) {}
virtual double area() { return 3.14159265358979323846 * m_radius * m_radius; }
};
class Cylinder : public Circle {
private:
double m_high;
public:
Cylinder(double r, double h) : Circle(r), m_high(h) {}
virtual double area() { return 2 * Circle::area() + 2 * 3.14159265358979323846 * m_radius * m_high; }
};
int main() {
double r, h;
cin >> r >> h;
Point* p1 = new Circle(r);
cout << fixed << setprecision(2) << p1->area() << endl;
Point* p2 = new Cylinder(r, h);
cout << fixed << setprecision(2) << p2->area() << endl;
delete p1;
delete p2;
return 0;
}
```
程序首先定义了一个基类 Point,其中只有一个虚函数 area,返回值为 0。然后定义了一个公有派生类 Circle,其中包含一个保护成员 m_radius 表示半径,并在构造函数中初始化。Circle 重写了虚函数 area,计算圆的面积并返回。接着定义了另一个公有派生类 Cylinder,包含一个私有成员 m_high 表示高,并在构造函数中同时初始化 Circle 的半径。Cylinder 同样重写了虚函数 area,计算圆柱体的表面积并返回。
在主函数中,首先读入圆的半径和圆柱的高,然后使用基类指针分别创建 Circle 和 Cylinder 对象,并调用它们的 area 函数计算面积。最后输出结果,记得使用 fixed 和 setprecision 控制输出精度,并在最后释放动态分配的对象。
阅读全文