题目描述
定义一个抽象类Shape,有一个纯虚函数calArea(),返回值为double型。由Shape类派生出4种几何图形:Triangle、Rectangle、Square、Circle,各自新增的数据成员均为double型。
定义两个普通的重载函数fun():返回值均为void,形参分别是抽象类的对象指针、抽象类的对象引用,在函数中通过指针或引用调用虚函数calArea(),输出结果。
主函数中,分别定义Triangle、Rectangle、Square、Circle类的对象,各初始值由键盘输入,分别调用fun(),输出各种图形的面积。
PI:3.1415926
输入描述
三角形的底和高
长方形的长和宽
正方形的连长
圆的半径
输出描述
分别调用fun()之后的结果
输入样例
5 7
4 5
6.7
3.4
输出样例
计算三角形面积:
通过基类指针调用,面积为:17.5
通过基类对象引用调用,面积为:17.5
计算长方形面积:
通过基类指针调用,面积为:20
通过基类对象引用调用,面积为:20
计算正方形面积:
通过基类指针调用,面积为:44.89
通过基类对象引用调用,面积为:44.89
计算圆形面积:
通过基类指针调用,面积为:36.3168
通过基类对象引用调用,面积为:36.3168
#include <iostream>
#define PI 3.1415926
using namespace std;
class Shape
{
public:
virtual double calArea() = 0;
};
void fun(Shape *a)
{
cout << "通过基类指针调用,面积为:" << a->calArea() << endl;
}
void fun(Shape &a)
{
cout << "通过基类对象引用调用,面积为:" << a.calArea() << endl;
}
class Triangle : public Shape
{
public:
Triangle(double x, double y)
{
a = x;
b = y;
}
double calArea()
{
return 0.5*a*b;
}
private:
double a, b;
};
class Rectangle : public Shape
{
public:
Rectangle(double x, double y)
{
a = x;
b = y;
}
double calArea()
{
return a * b;
}
private:
double a, b;
};
class Square : public Shape
{
public:
Square(double x)
{
a = x;
}
double calArea()
{
return a * a;
}
private:
double a;
};
class Circle : public Shape
{
public:
Circle(double x)
{
a = x;
}
double calArea()
{
return a * a*PI;
}
private:
double a;
};
int main()
{
Shape *ptr;
double a, b, c, d;
double x, r;
cin >> a >> b >> c >> d >> x >> r;
Triangle t(a, b);
ptr = &t;
Shape &o = t;
cout << "计算三角形面积:" << endl;
fun(ptr);
fun(o);
Rectangle re(c, d);
ptr = &re;
Shape &o1 = re;
cout << "计算长方形面积:" << endl;
fun(ptr);
fun(o1);
Square s(x);
ptr = &s;
Shape &o2 = s;
cout << "计算正方形面积:" << endl;
fun(ptr);
fun(o2);
Circle cir(r);
ptr = ○
Shape &o3 = cir;
cout << "计算圆形面积:" << endl;
fun(ptr);
fun(o3);
return 0;
}