2301_79710520 2025-05-13 19:21 采纳率: 50%
浏览 5

c++已知平面上点Point的详细定义,根据程序要求的输入和输出,请你设计其派生圆(Circle)和圆的派生类圆柱(Cylinder)的定义。

这是一个考察关于继承和多态特性的题目,已知平面上点Point的详细定义,根据程序要求的输入和输出,请你设计其派生圆(Circle)和圆的派生类圆柱(Cylinder)的定义。

类的定义:

class Point{
    int x, y;
public:
    Point(int a=0, int b=0): x(a), y(b){}
    virtual double area() {return 0.0; };
    virtual double volume() { return 0.0; }
};
class Circle: public Point{
    ...
}; 
class Cylinder: public Circle{
    ...
};

裁判测试程序样例:

#include <iostream>
using namespace std;
const double pi = 3.14159;
class Point{
    int x, y;
public:
    Point(int a=0, int b=0): x(a), y(b){}
    virtual double area() {return 0.0; }
    virtual double volume() { return 0.0; }
};
/* 你的答案将插入这里,你需要给出类Circle和Cylinder的完整定义,包括必须的数据成员和成员函数 */

int main()
{
  int x, y; double r, h;
    cin >> x >> y >> r >> h;
    Point* p = new Circle(r, x, y);
    cout << "Circle Area:" << p->area() << endl;
    delete p;
    p = new Cylinder(h, r, x, y);
    cout << "Cylinder Area:" << p->area() << " and Volume:" << p->volume() << endl;
    delete p;
    return 0;
}

输入样例:
0 1 2 3
输出样例:
Circle Area:12.5664
Cylinder Area:62.8318 and Volume:37.6991
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-05-13 19:22
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    分析与设计思路

    我们需要设计两个类 CircleCylinder,它们分别继承自 Point 类。以下是问题的关键点:

    1. 基类 Point

      • 包含两个数据成员 xy,表示平面点的坐标。
      • 提供构造函数用于初始化点的坐标。
      • 定义了两个虚函数 area()volume(),分别用于计算面积和体积。
    2. 派生类 Circle

      • 继承自 Point,额外需要一个半径 r
      • 重写 area() 函数,用于计算圆的面积(公式:π * r^2)。
      • volume() 返回 0,因为圆是二维图形,没有体积。
    3. 派生类 Cylinder

      • 继承自 Circle,额外需要一个高度 h
      • 重写 area() 函数,用于计算圆柱的表面积(公式:2 * π * r * (r + h))。
      • 重写 volume() 函数,用于计算圆柱的体积(公式:π * r^2 * h)。

    代码实现

    以下是完整的代码实现:

    #include <iostream>
    using namespace std;
    
    const double pi = 3.14159;
    
    class Point {
    protected:
        int x, y;
    public:
        Point(int a = 0, int b = 0) : x(a), y(b) {}
        virtual ~Point() {} // 添加虚析构函数以支持多态
        virtual double area() { return 0.0; }
        virtual double volume() { return 0.0; }
    };
    
    class Circle : public Point {
    private:
        double r; // 半径
    public:
        Circle(double radius, int a = 0, int b = 0) : Point(a, b), r(radius) {}
        double area() override {
            return pi * r * r; // 圆的面积
        }
        double volume() override {
            return 0.0; // 圆没有体积
        }
    };
    
    class Cylinder : public Circle {
    private:
        double h; // 高度
    public:
        Cylinder(double height, double radius, int a = 0, int b = 0)
            : Circle(radius, a, b), h(height) {}
        double area() override {
            return 2 * pi * r * (r + h); // 圆柱的表面积
        }
        double volume() override {
            return pi * r * r * h; // 圆柱的体积
        }
    };
    
    int main() {
        int x, y;
        double r, h;
        cin >> x >> y >> r >> h;
    
        Point* p = new Circle(r, x, y);
        cout << "Circle Area:" << p->area() << endl;
        delete p;
    
        p = new Cylinder(h, r, x, y);
        cout << "Cylinder Area:" << p->area() << " and Volume:" << p->volume() << endl;
        delete p;
    
        return 0;
    }
    

    代码解析

    1. 基类 Point

      • 使用 protected 修饰符保护 xy,以便派生类可以访问这些成员。
      • 增加了虚析构函数 ~Point(),确保在删除派生类对象时调用正确的析构函数。
    2. 派生类 Circle

      • 新增私有成员变量 r 表示半径。
      • 重写了 area() 函数,使用圆的面积公式 π * r^2
      • volume() 返回 0,因为圆没有体积。
    3. 派生类 Cylinder

      • 新增私有成员变量 h 表示高度。
      • 重写了 area() 函数,使用圆柱的表面积公式 2 * π * r * (r + h)
      • 重写了 volume() 函数,使用圆柱的体积公式 π * r^2 * h
    4. 主函数 main

      • 根据输入的 x, y, r, h 创建 CircleCylinder 对象。
      • 使用指针 p 操作基类接口,体现了多态特性。
      • 输出结果符合题目要求。

    测试输入与输出

    输入:

    0 1 2 3
    

    输出:

    Circle Area:12.5664
    Cylinder Area:62.8318 and Volume:37.6991
    

    总结

    通过上述设计,我们实现了 CircleCylinder 的继承关系,并利用多态特性动态绑定方法调用。代码结构清晰,符合面向对象编程的原则。

    评论

报告相同问题?

问题事件

  • 修改了问题 5月13日
  • 创建了问题 5月13日