C++继承与多态练习--计算图形面积

1.目的:

/*设计一个计算图形面积的类库。
类库的顶层是一个抽象类,并且提供三个纯虚函数;显示数据成员、返回面积和返回体积。
Class Shape
{
virtual void showData()=0;
virtual double reArea()=0;
virtual double reVolume()=0;
};
第二层由Shape类派生TwoDimShape(二维图形)和ThreeShape(三维图形),
它们增加了有关的数据成员,但没有成员函数的实现。
第三层派生具体的图形类。TwoDimShape类派生Circle(圆)、Elipse(椭圆)、
Rectangle(矩形)和Triangle(三角形)等类。
ThreeShape类派生Ball(球体)、Cylinder(圆柱体)、
RectangularParallelepiped(长方体)等类。
在主函数测试中使用多态方式调用不同对象的求值函数。
*/

2.代码如下:

/*
*This file contains code for C++ 6th experiment
*By LZH
*/
#include<iostream>
#include<string>
using namespace std;
const double PI = acos(-1.0);
// Definition of Shape class and related functions goes here
class Shape
{
    virtual void showData() = 0;
    virtual double reArea() = 0;
    virtual double reVolume() = 0;
};
class TwoDimShape :virtual public Shape {
protected:
    double x, y;
public:
    virtual void showData() {
        return ;
    }
    virtual double reArea() {
        return 0;
    }
    virtual double reVolume() {
        return 0;
    }
};
class ThreeShape :virtual public Shape {
protected:
    double x, y, z;
public:
    virtual void showData() {
        return;
    }
    virtual double reArea() {
        return 0;
    }
    virtual double reVolume() {
        return 0;
    }
};
class Circle :virtual public TwoDimShape {
public:
    Circle(double tp) {
        x = tp;
    }
    Circle(Circle &asp) {
        x = asp.x;
    }
    ~Circle()
    {

    }
    void showData() {
        cout << "This is a Circle:" << endl
            << "The radiation:" << x << endl
            << "The area:" << reArea() << endl;
    }
    double reArea() {
        return PI*x*x;
    }
};
class Elipse :virtual public TwoDimShape {
public:
    Elipse(double ta, double tb) {
        x = ta, y = tb;
    }
    Elipse(Elipse &asp) {
        x = asp.x, y = asp.y;
    }
    ~Elipse() {

    }
    void showData() {
        cout << "This is a Elipse:" << endl
            << "The long axis:" << x << endl
            << "The short axis:" << y << endl
            << "The area:" << reArea() << endl;
    }
    double reArea() {
        return PI*x*y;
    }
};
class Rectangle :virtual public TwoDimShape {
public:
    Rectangle(double ta, double tb) {
        x = ta, y = tb;
    }
    Rectangle(Rectangle &asp) {
        x = asp.x, y = asp.y;
    }
    ~Rectangle() {

    }
    void showData() {
        cout << "This is a Rectangle:" << endl
            << "The long axis:" << x << endl
            << "The short axis:" << y << endl
            << "The area:" << reArea() << endl;
    }
    double reArea() {
        return x*y;
    }
};
class Triangle :virtual public TwoDimShape {
public:
    Triangle(double ta, double tb) {
        x = ta, y = tb;
    }
    Triangle(Triangle &asp) {
        x = asp.x, y = asp.y;
    }
    ~Triangle() {

    }
    void showData() {
        cout << "This is a Triangle:" << endl
            << "The base length:" << x << endl
            << "The height  :" << y << endl
            << "The area:" << reArea() << endl;
    }
    double reArea() {
        return x*y / 2.0;
    }
};
class Ball :virtual public ThreeShape {
public:
    Ball(double ta) {
        x = ta;
    }
    Ball(Ball &asp) {
        x = asp.x;
    }
    ~Ball() {

    }
    void showData() {
        cout << "This is a Ball:" << endl
            << "The radiation:" << x << endl
            << "The surface area:" << reArea() << endl;
    }
    double reArea() {
        return PI*pow(x, 3)*4.0 / 3.0;
    }
    double reVolume() {
        return PI*x*x;
    }
};
class Cylinder :virtual public ThreeShape {
public:
    /*
    V=PI*r*r*h S=2*PI*r+r*h
    */
    Cylinder(double ta, double tb) {
        x = ta, y = tb;
    }
    Cylinder(Cylinder &asp) {
        x = asp.x, y = asp.y;
    }
    ~Cylinder() {

    }
    void showData() {
        cout << "This is a Cylinder:" << endl
            << "The radiation:" << x << endl
            << "The height:" << y << endl
            << "The surface area:" << reArea() << endl;
    }
    double reArea() {
        return 2 * PI*x + x*y;
    }
    double reVolume() {
        return PI*x*x*y;
    }
};
//RectangularParallelepiped
class cuboid :virtual public ThreeShape {
public:
    cuboid(double ta, double tb, double tc) {
        x = ta, y = tb, z = tc;
    }
    cuboid(cuboid &asp) {
        x = asp.x, y = asp.y, z = asp.z;
    }
    void showData() {
        cout << "This is a cuboid:" << endl
            << "The length:" << x << endl
            << "The width:" << y << endl
            << "The height" << z << endl
            << "The surface area:" << reArea() << endl;

    }
    double reArea() {
        return 2 * (x*y + x*z + y*z);
    }
    double reVolume() {
        return x*y*z;
    }
};
int main(void) {
    TwoDimShape a;
    ThreeShape b;
    TwoDimShape *p = &a;
    ThreeShape *w = &b;
    Circle t1(1.0);
    Elipse t2(1.0, 2.0);
    Rectangle t3(10.0,2.3);
    Triangle t4(4.0, 5.0);
    Ball t5(2.33333);
    Cylinder t6(4.5, 65.0);
    cuboid t7(132, 5,156);
    p = &t1;
    p->showData();
    p = &t2;
    p->showData();
    p = &t3;
    p->showData();
    p = &t4;
    p->showData();
    w = &t5;
    w->showData();
    w = &t6;
    w->showData();
    w = &t7;
    w->showData();
    return 0;
}

3 . 测试截图

4.关于多态性

 在这个例子中我用了基类指针指向基类,这个不难理解,在类型兼容规则下,
 指向基类的指针可以隐式的转换成派生类的指针。
 这是最常见的关于多态的用法,利用该指针指向任意一个子类对象,
 就可以调用相应的虚函数,指向的子类的不同,实现的方法也就不同。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

php面试题(二)

1 <?php echo count (false); $a = count ("567") + count(null) + count(false); ec...

47480
来自专栏数据结构与算法

P1062 数列

题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,...

31770
来自专栏逆向技术

C语言第六讲,数组

          C语言第六讲,数组 一丶什么是数组 数组,就是一整块的连续内存空间. 且类型都是一样的.大小一样 比如: ? 1.1数组元素的访问 我们要访...

72230
来自专栏软件开发 -- 分享 互助 成长

使用数字进行字符遍历

有些时候使用数字进行遍历,然后将数字转化成需要的进制数,再将进制数对应成需要的字符是一种非常有效的方法。 如: 输入一个正整数X,在下面的等式左边的数字之间添加...

245100
来自专栏CodingToDie

Python学习(三): 列表(list)和流程控制

第3 章 列表(list)和流程控制 Table of Contents 列表 顺序执行 条件判断 循环 小例子 列表 相信大家在其他语言中都使用过 列表,在 ...

39650
来自专栏Vamei实验室

Python补充05 字符串格式化 (%操作符)

在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出。Python中内置有对字符串进行格式化的操作%。 模板 格式化字符串时...

25290
来自专栏程序生活

最大连续子序列和

https://blog.csdn.net/bitcarmanlee/article/details/51526010

12520
来自专栏猿人谷

C++ STL算法系列3---求和:accumulate

 该算法在numeric头文件中定义。 假设vec是一个int型的vector对象,下面的代码: //sum the elements in vec start...

26880
来自专栏WD学习记录

牛客网 数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的...

14230
来自专栏JavaEdge

美团18春招编程笔试题赏析1 字符串距离2 数字字符

34580

扫码关注云+社区

领取腾讯云代金券