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

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

定义抽象基类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>
#include <iomanip>
using namespace std;
const float PI = 3.14159f;
class Shape {
public:
    Shape(){};
    virtual float area() = 0;
};

class Circle: public Shape {
public:
    Circle(float r = 0): r(r) {}
    float area();
private:
    float r;
};
float Circle::area(){
    return (PI * r * r);
}
class Square: public Shape {
public:
    Square(float a = 0): a(a)  {}
    float area();
private:
    float a;
};
float Square::area(){
    return (a * a);
}
class Rectangle: public Shape {
public:
    Rectangle(float g = 0,float k = 0): g(g),k(k)  {}
    float area();
private:
    float g;
    float k;
};
float Rectangle::area(){
    return (g * k);
}
class Trapezoid: public Shape {
public:
    Trapezoid(float sd = 0,float xd = 0,float hh = 0): sd(sd),xd(xd),hh(hh) {}
    float area();
private:
    float sd;
    float xd;
    float hh;
};
float Trapezoid::area(){
    return (((sd + xd) * hh) / 2);
}
class Triangle: public Shape {
public:
    Triangle(float d = 0,float h = 0): d(d),h(h) {}
    float area();
private:
    float h;
    float d;
};
float Triangle::area(){
    return ((d * h) / 2);
}
int main() {
    Shape *s;
    float r,a,k,g,sd,xd,hh,d,h;
    cin>>r>>a>>k>>g>>sd>>xd>>hh>>d>>h;
    Circle circle(r);
    Square square(a);
    Rectangle rectangle(g,k);
    Trapezoid trapezoid(sd,xd,hh);
    Triangle triangle(d,h);
    s = &circle;
    float area = s->area();
    s = &square;
    area += s->area();
    s = &rectangle;
    area += s->area();
    s = &trapezoid;
    area += s->area();
    s = &triangle;
    area += s->area();
    cout<<fixed<<setprecision(3)<<area<<endl;
    return 0;
}

总结

  1. 抽象类不能产生对象,所以基类的指针不能指向自己,调用area()函数。
  2. virtual写一个就够了,之后的area()函数都能够被覆盖。
  3. 如果派生类没有主动调用基类的构造函数,那么会默认调用基类的构造函数,所以这时,基类的构造函数一定要显性的写出来,否则会编译错误。
  4. 覆盖:函数名同名,参数类型,顺序,数量,是否缺省,返回类型,都必须一样,否则就不是覆盖,而是重载。

自我理解,有错误欢迎指正。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值