【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】

简介: 【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】

前言

大家好吖,欢迎来到 YY 滴C++考前速过系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁

主要内容含:

\


程序1:

  • 写一个程序,定义抽象基类Container,由它派生出3个派生类:Sphere(球体)、Cylinder(圆柱体)、Cube(正方体)。用虚函数分别计算几种图形的表面积和体积。

以下是一个使用虚函数计算不同图形表面积和体积的示例程序:

#include <iostream>
#include <cmath>
using namespace std;

// 抽象基类:Container
class Container {
public:
    virtual double calculateSurfaceArea() = 0;
    virtual double calculateVolume() = 0;
};

// 派生类:Sphere(球体)
class Sphere : public Container {
private:
    double radius;

public:
    Sphere(double r) : radius(r) {}

    double calculateSurfaceArea() override {
        return 4 * M_PI * radius * radius;
    }

    double calculateVolume() override {
        return (4.0 / 3.0) * M_PI * radius * radius * radius;
    }
};

// 派生类:Cylinder(圆柱体)
class Cylinder : public Container {
private:
    double radius;
    double height;

public:
    Cylinder(double r, double h) : radius(r), height(h) {}

    double calculateSurfaceArea() override {
        return 2 * M_PI * radius * radius + 2 * M_PI * radius * height;
    }

    double calculateVolume() override {
        return M_PI * radius * radius * height;
    }
};

// 派生类:Cube(正方体)
class Cube : public Container {
private:
    double sideLength;

public:
    Cube(double s) : sideLength(s) {}

    double calculateSurfaceArea() override {
        return 6 * sideLength * sideLength;
    }

    double calculateVolume() override {
        return sideLength * sideLength * sideLength;
    }
};

int main() {
    Sphere s(5);
    Cylinder c(3, 7);
    Cube cu(4);

    cout << "Sphere Surface Area: " << s.calculateSurfaceArea() << endl;
    cout << "Sphere Volume: " << s.calculateVolume() << endl;

    cout << "Cylinder Surface Area: " << c.calculateSurfaceArea() << endl;
    cout << "Cylinder Volume: " << c.calculateVolume() << endl;

    cout << "Cube Surface Area: " << cu.calculateSurfaceArea() << endl;
    cout << "Cube Volume: " << cu.calculateVolume() << endl;

    return 0;
}

在这个示例中,我们定义了抽象基类 Container,并派生出了 Sphere(球体)、Cylinder(圆柱体)和

Cube(正方体)三个派生类。每个派生类都实现了 calculateSurfaceArea

calculateVolume

虚函数来计算不同图形的表面积和体积。在 main 函数中,我们创建了每种图形的实例,并输出了它们的表面积和体积。

程序2:

编写程序:定义抽象基类Shape,area( )为求图形面积的虚成员函数。由它派生出三个派生类:Circle(圆形)、Rectangle(长方形)、和Triangle (三角形),用虚函数area分别计算各种图形的面积。在主函数中,分别创建派生类的对象并计算其面积,求出它们的面积的和。要求用基类指针数组,使它的每一个元素指向一个派生类的对象,以体现多态性。

以下是一个使用多态性的示例程序,根据要求定义了抽象基类 Shape 和三个派生类 Circle(圆形)、Rectangle(长方形)和 Triangle(三角形):

#include <iostream>
#include <cmath>
using namespace std;

// 抽象基类:Shape
class Shape {
public:
    virtual double area() = 0;
};

// 派生类:Circle(圆形)
class Circle : public Shape {
private:
    double radius;

public:
    Circle(double r) : radius(r) {}

    double area() override {
        return M_PI * radius * radius;
    }
};

// 派生类:Rectangle(长方形)
class Rectangle : public Shape {
private:
    double length;
    double width;

public:
    Rectangle(double l, double w) : length(l), width(w) {}

    double area() override {
        return length * width;
    }
};

// 派生类:Triangle(三角形)
class Triangle : public Shape {
private:
    double base;
    double height;

public:
    Triangle(double b, double h) : base(b), height(h) {}

    double area() override {
        return 0.5 * base * height;
    }
};

int main() {
    Shape* shapes[3];
    shapes[0] = new Circle(5);
    shapes[1] = new Rectangle(4, 6);
    shapes[2] = new Triangle(3, 8);

    double totalArea = 0;
    for (int i = 0; i < 3; i++) {
        totalArea += shapes[i]->area();
    }

    cout << "Total area of all shapes: " << totalArea << endl;

    for (int i = 0; i < 3; i++) {
        delete shapes[i];
    }

    return 0;
}


在这个示例中,我们定义了抽象基类 Shape,并派生出了 Circle(圆形)、Rectangle(长方形)和

Triangle(三角形)三个派生类。每个派生类都实现了虚函数 area 来计算不同图形的面积。在 main

函数中,我们创建了一个基类指针数组,使其每个元素指向一个派生类的对象,以体现多态性。然后我们计算了每个图形的面积,并求出它们的面积的和。最后,记得释放动态分配的内存。

程序3:

计算正方体、球体、圆柱体的体积。要求:定义基类shape,在其中定义求体积的纯虚函数volume,并定义一个数据成员r,它可作为球体的半径、正方体的边长以及圆柱体的底面圆半径。由shape类派生出3个类,分别是正方体类、球体类和圆柱体类,在这3个类中都具有求体积的重定义版本。在主函数中统一求3种对象的体积,实现多态性。

以下是符合您要求的C++程序,其中定义了一个抽象基类 Shape,并派生出了 Cube(正方体)、Sphere(球体)和 Cylinder(圆柱体)三个派生类:

#include <iostream>
#include <cmath>
using namespace std;

// 抽象基类:Shape
class Shape {
public:
    virtual double volume() = 0;
};

// 派生类:Cube(正方体)
class Cube : public Shape {
private:
    double sideLength;

public:
    Cube(double s) : sideLength(s) {}

    double volume() override {
        return sideLength * sideLength * sideLength;
    }
};

// 派生类:Sphere(球体)
class Sphere : public Shape {
private:
    double radius;

public:
    Sphere(double r) : radius(r) {}

    double volume() override {
        return (4.0 / 3.0) * M_PI * pow(radius, 3);
    }
};

// 派生类:Cylinder(圆柱体)
class Cylinder : public Shape {
private:
    double radius;
    double height;

public:
    Cylinder(double r, double h) : radius(r), height(h) {}

    double volume() override {
        return M_PI * pow(radius, 2) * height;
    }
};

int main() {
    Shape* shapes[3];
    shapes[0] = new Cube(5); // 正方体边长为5
    shapes[1] = new Sphere(3); // 球体半径为3
    shapes[2] = new Cylinder(4, 6); // 圆柱体底面圆半径为4,高度为6

    for (int i = 0; i < 3; i++) {
        cout << "Volume of shape " << i+1 << ": " << shapes[i]->volume() << endl;
    }

    for (int i = 0; i < 3; i++) {
        delete shapes[i];
    }

    return 0;
}

在这个示例中,我们定义了抽象基类 Shape,并派生出了 Cube(正方体)、Sphere(球体)和

Cylinder(圆柱体)三个派生类。每个派生类都实现了虚函数 volume 来计算不同图形的体积。在 main

在这个示例中,我们定义了抽象基类 Shape,并派生出了 Cube(正方体)、Sphere(球体)和

Cylinder(圆柱体)三个派生类。每个派生类都实现了虚函数 volume 来计算不同图形的体积。在 main

相关文章
|
7月前
|
运维 网络协议 网络安全
Kali虚拟机间搭建iodine DNS隧道实验指南
本指南介绍如何在两台Kali虚拟机间使用iodine搭建DNS隧道。通过服务端(192.168.1.44)与客户端(192.168.1.36)配置,利用DNS查询建立虚拟局域网,实现受限网络下的隐蔽通信。包含环境准备、命令详解、连通性测试及故障排查,助你快速掌握DNS隧道技术原理与实践应用。(238字)
1248 7
|
算法 PyTorch 算法框架/工具
昇腾 msmodelslim w8a8量化代码解析
msmodelslim w8a8量化算法原理和代码解析
1153 5
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
262 4
|
人工智能 文字识别 自然语言处理
保单AI识别技术及代码示例解析
车险保单包含基础信息、车辆信息、人员信息、保险条款及特别约定等关键内容。AI识别技术通过OCR、文档结构化解析和数据校验,实现对保单信息的精准提取。然而,版式多样性、信息复杂性、图像质量和法律术语解析是主要挑战。Python代码示例展示了如何使用PaddleOCR进行保单信息抽取,并提出了定制化训练、版式分析等优化方向。典型应用场景包括智能录入、快速核保、理赔自动化等。未来将向多模态融合、自适应学习和跨区域兼容性发展。
948 29
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
545 5
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1290 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
528 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

推荐镜像

更多
  • DNS