C/C++---图形类(继承与派生、纯虚函数、动态联编的多态性)

简介: C/C++---图形类(继承与派生、纯虚函数、动态联编的多态性)

【问题描述】

(1)首先设计一个抽象类Shape,包含三个公有的纯虚函数,分别实现显示数据成员的值、计算面积、计算体积的功能,函数名为ShowData()、GoArea()、GoVolume()

(2)设计两个Shape的公有派生类平面图形类、立体图形类,包含公有的数据成员面积area和体积volume,并实现基类Shape的三个纯虚函数的函数体。

(3)分别设计圆形类、椭圆类、矩形类、等腰三角形类,作为平面图形类的公有派生类。并在各个类里依次添加数据成员圆形半径、椭圆的横轴和纵轴长度、矩形的长和宽、等腰三角形的底边长和高。并实现数据的显示输出函数、实现计算面积的函数。

(4)分别设计球类、圆柱体类、长方体类,作为立体图形类的公有派生类。并在各个类里依次添加数据成员球的半径,圆柱体的底面的半径和高,长方体的长宽高。并实现数据的显示输出函数、实现计算体积的函数。

(5)计算面积的函数和计算体积的函数均需要先cin相应的数据,再才能计算,计算结果为double型,且保留2位小数,将计算结果给相应的数据成员进行赋值。函数无返回值。

(6)测试数据时,定义各种类型的对象,然后定义Shape类型的指针p,用户依次输入1、2、3…6、7,分别代表圆形、椭圆、矩形、三角形、球、圆柱体、长方体。通过使用switch语句,将对象地址赋值给p指针。然后调用该对象的计算面积或计算体积的函数,输出计算结果。为方便测试,switch仅执行一次,程序则结束。

举例:

Shape *p;

Circle c;

p=&c;

p->GoArea();

p->ShowData();

【样例输入】

5

2

【样例输出】

33.51

【样例说明】
5代表球,2代表球的半径,根据体积公式4/3pirrr得到33.51

代码如下

#include<iostream>
#include<iomanip>
using namespace std;
#define PI 3.14159265
class Shape
{
public:
    virtual void ShowData() = 0;
    virtual void GoArea() = 0;
    virtual void GoVolume() = 0;
private:
};
class Plane_Figure:virtual public Shape
{
public:
    void ShowData() { cout << fixed << setprecision(2) << area << endl; }
    void GoArea() { area = 0; }
    void GoVolume() { volume = 0; }

    double area;
    double volume;
};
class Solid_Figure:virtual public Shape
{
public:
    void ShowData() { cout << fixed << setprecision(2) << volume << endl; }
    void GoArea() { area = 0; }
    void GoVolume() { volume = 0; }

    double area;
    double volume;
};
class Circle :public Plane_Figure
{
public:
    void ShowData() { cout << fixed << setprecision(2) << area << endl; }
    void GoArea()
    {
        cin >> r;
        area = PI*r*r;
    }
private:
    int r;
};
class Ellipse :public Plane_Figure
{
public:
    void ShowData() { cout << fixed << setprecision(2) << area << endl; }
    void GoArea()
    {
        cin >> a >> b;
        area = PI*a*b;
    }
private:
    int a;
    int b;
};
class Rectangle :public Plane_Figure
{
public:
    void ShowData() { cout << fixed << setprecision(2) << area << endl; }
    void GoArea()
    {
        cin >> l >> w;
        area = l*w;
    }
private:
    int l;
    int w;
};
class Tag :public Plane_Figure
{
public:
    void ShowData() { cout << fixed << setprecision(2) << area << endl; }
    void GoArea()
    {
        cin >> b >> h;
        area = (b*h) / 2;
    }
private:
    int b;
    int h;
};
///
class Ball :public Solid_Figure
{
public:
    void ShowData() { cout << fixed << setprecision(2) << volume << endl; }
    void GoVolume()
    {
        cin >> R;
        volume = (4 * PI*R*R*R) / 3;
    }
private:
    int R;
};
class Column :public Solid_Figure
{
public:
    void ShowData() { cout << fixed << setprecision(2) << volume << endl; }
    void GoVolume()
    {
        cin >> R >> H;
        volume = PI*R*R + 2*PI*R*H;
    }
private:
    int R;
    int H;
};
class Cuboid :public Solid_Figure
{
public:
    void ShowData() { cout << fixed << setprecision(2) << volume << endl; }
    void GoVolume()
    {
        cin >> L >> W >> H;
        volume = L*W*H;
    }
private:
    int L;
    int W;
    int H;
};

int main()
{
    Shape *p;
    Circle cc;
    Ellipse e;
    Rectangle r;
    Tag t;
    Ball b;
    Column cl;
    Cuboid cb;
    int n;
    cin >> n;
    switch (n)
    {
    case 1://圆形
        p = &cc;
        p->GoArea();
        p->ShowData(); break;
    case 2://椭圆
        p = &e;
        p->GoArea();
        p->ShowData(); break;
    case 3://矩形
        p = &r;
        p->GoArea();
        p->ShowData(); break;
    case 4://三角形
        p = &t;
        p->GoArea();
        p->ShowData(); break;
    case 5://球
        p = &b;
        p->GoVolume();
        p->ShowData(); break;
    case 6://圆柱体
        p = &cl;
        p->GoVolume();
        p->ShowData(); break;
    case 7://长方体
        p = &cb;
        p->GoVolume();
        p->ShowData(); break;
    default:
        break;
    }
    return 0;
}


相关文章
|
27天前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
32 1
【C++】继承
|
25天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
83 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
80 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
88 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
26 1
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
31 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
32 4
|
2月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
2月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)