7-3 用虚函数计算各种图形的面积

本文介绍如何使用虚函数在C++中定义抽象基类Shape,并派生出Circle、Square、Rectangle、Trapezoid和Triangle五种图形类,通过基类指针数组计算并输出各自面积,实现灵活的图形面积计算功能。

7-3 用虚函数计算各种图形的面积
定义抽象基类Shape,由它派生出五个派生类:
Circle(圆形)、Square(正方形)、Rectangle( 长方形)、Trapezoid (梯形)和Triangle (三角形),
用虚函数分别计算各种图形的面积,输出它们的面积和。要求用基类指针数组,每一个数组元素指向一个派生类的对象。
PI=3.14159f,单精度浮点数计算。
输入格式:
输入在一行中,给出9个大于0的数,用空格分隔,分别代表
圆的半径,正方形的边长,矩形的宽和高,梯形的上底、下底和高,三角形的底和高。
输出格式:
输出所有图形的面积和,小数点后保留3位有效数字。
输入样例:
12.6 3.5 4.5 8.4 2.0 4.5 3.2 4.5 8.4
输出样例:
578.109 


#include<iostream>
using namespace std;
#define PI 3.14159
class Shape
{
protected:
    double a, b, c;
public:
    Shape(double a=0,double b=0,double c=0)
    {
        this->a = a; this->b = b;
        this->c = c;
    }
    virtual double getmianji() = 0;
};
class Circle:public Shape//(圆形)
{//Circle(圆形)、Square(正方形)、Rectangle( 长方形)、Trapezoid (梯形)和Triangle (三角形)
public:
    Circle(double a) :Shape(a) {}
    double getmianji()
    {
        return PI * a * a;
    }
};
class Square :public Shape//(正方形)
{
public:
    Square(double a) :Shape(a) {}
    double getmianji()
    {
        return  a * a;
    }
};
class Rectangle :public Shape//(长方形)
{
public:
    Rectangle(double a,double b) :Shape(a,b) {}
    double getmianji()
    {
        return a*b;
    }
};
class Trapezoid :public Shape//(梯形)
{
public:
    Trapezoid(double a,double b,double c) :Shape(a,b,c) {}
    double getmianji()
    {
        return (a + b) * c * 0.5;
    }
};
class Triangle :public Shape//(三角形)
{
public:
    Triangle(double a,double b) :Shape(a,b) {}
    double getmianji()
    {
        return a*b*0.5;
    }
};
int main()
{//12.6 3.5 4.5 8.4 2.0 4.5 3.2 4.5 8.4
    //要求用基类指针数组

    double a, b, c;
    cin >> a;
    Circle C(a);
    cin >> a ;
    Square s(a);
    cin >> a >> b;
    Rectangle r(a, b);
    cin >> a >> b >> c;
    Trapezoid t1(a, b, c);
    cin >> a >> b;
    Triangle t2(a, b);
    Shape* sp[5] = { &C,&s,&r,&t1,&t2 };
    double sum = 0;
    for (int i = 0; i < 5; i++)
    {
        sum += sp[i]->getmianji();
    }
    printf("%0.3f", sum);
    system("pause");
}

### 回答1: 这道题目要求使用虚函数计算各种图形面积虚函数是一种在基类中声明的函数,它可以被派生类重写,从而实现多态性。在这个问题中,我们可以定义一个基类Shape,其中包含一个虚函数area(),用于计算图形面积。然后,我们可以派生出各种图形的类,如圆形、矩形、三角形等,这些类都可以重写area()函数,以计算自己的面积。最后,我们可以创建这些类的对象,并调用它们的area()函数来计算它们的面积。这样,我们就可以使用虚函数计算各种图形面积了。 ### 回答2: 题目要求使用虚函数计算各种图形面积虚函数是一种动态多态性的体现,它使得子类重写父类的方法,以便实现相同的行为呈现不同的结果。在计算图形面积的问题上,如果我们想要使用不同的公式来计算不同类型的图形面积,我们就可以利用虚函数来实现这个目的。 实现步骤: 1. 定义一个基类&#39;BaseShape&#39;,其中包含一个纯虚函数&#39;virtual float area() = 0;&#39;,用于计算图形面积。 2. 定义多个继承自&#39;BaseShape&#39;的子类,分别对应不同类型的图形,每个子类中都需要重写基类的区函数,并实现相应的计算面积的逻辑。 3. 在主函数中,可以通过基类指针指向子类对象,然后调用这个指针的&#39;area()&#39;函数,来计算选定图形面积。 例如: class BaseShape { public: virtual float area() = 0; }; class Circle : public BaseShape { public: float radius; Circle(float r) : radius(r) {} virtual float area() { return 3.14f * radius * radius; } }; class Rectangle : public BaseShape { public: float length, width; Rectangle(float l, float w) : length(l), width(w) {} virtual float area() { return length * width; } }; int main() { BaseShape* circle1 = new Circle(5.5f); //定义一个类型为圆形的对象 BaseShape* rectangle1 = new Rectangle(4.0f, 5.0f); //定义一个类型为矩形的对象 std::cout << "面积为:" << circle1->area() << std::endl; //输出圆形对象的面积 std::cout << "面积为:" << rectangle1->area() << std::endl; //输出矩形对象的面积 delete circle1; delete rectangle1; return 0; } 在这个例子里,我们定义了两个子类,圆形和矩形,每个子类都有自己的计算面积的函数。在主函数中,我们通过基类指针分别创建了一个圆形对象和一个矩形对象,并用同样的方式输出了它们的面积。这里需要注意的是,由于基类的计算面积的函数是纯虚函数,所以被定义为抽象类,只能被继承。这样,我们就可以利用虚函数来实现对不同图形类型的面积计算,并能够实现代码的高效复用。 ### 回答3: 这道题目要求我们使用虚函数计算各种图形面积虚函数C++中的一种重要特性,它允许在父类中声明一个虚函数,在子类中进行重写,以便实现多态性。本题的解题思路就是通过抽象出一个图形类,再派生出各种不同的子类,利用多态性来计算不同形状的图形面积。 对于这个图形类,我们需要在其内部定义一个纯虚函数`virtual double area() = 0;`。记得在该纯虚函数前面加上关键字virtual,表示该函数是一个虚函数。并且要在最后面加上`= 0`,表示它是一个纯虚函数,不能被子类继承而不重写。 接着派生出一个`Rectangle`(矩形)类和一个`Circle`(圆形)类,并分别实现其`area()`函数。这些子类的`area()`函数将override父类的虚函数,具体实现不同的面积计算方法。例如矩形的面积计算公式是长乘以宽,圆形的面积计算公式是π乘以半径的平方。 下面我们需要一个计算各种图形面积的函数,这个函数的具体实现就要用到多态性了。这个函数的输入式一个指向图形类的指针,运用虚函数的特性,直接调用该指针所指向的对象的`area()`函数。然后将计算出的面积打印出来即可。 当然,这个虚函数除了`area()`函数外,我们还可以在图像类中定义其他虚函数或普通成员函数,例如计算周长、获取名称等等。这样,我们就可以使用虚函数实现面向对象编程的多态性和抽象性,将代码设计得更加优雅和可扩展。 最后,在运行时,我们可以用指向子类对象的基类指针来代替子类对象的名称,从而生成子类对象的实例并调用相应的函数。这种方式也被称为向上类型转换。例如: ``` Shape *shape = new Rectangle(5.0, 6.0); cout << "Rectangle area is: " << shape->area() << endl; ``` 这段代码将会生成一个`Rectangle`对象,并调用其`area()`函数,最终输出结果为矩形的面积
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值