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 = □
area += s->area();
s = &rectangle;
area += s->area();
s = &trapezoid;
area += s->area();
s = ▵
area += s->area();
cout<<fixed<<setprecision(3)<<area<<endl;
return 0;
}
总结
- 抽象类不能产生对象,所以基类的指针不能指向自己,调用area()函数。
- virtual写一个就够了,之后的area()函数都能够被覆盖。
- 如果派生类没有主动调用基类的构造函数,那么会默认调用基类的构造函数,所以这时,基类的构造函数一定要显性的写出来,否则会编译错误。
- 覆盖:函数名同名,参数类型,顺序,数量,是否缺省,返回类型,都必须一样,否则就不是覆盖,而是重载。
自我理解,有错误欢迎指正。