题目描述
KiKi理解了继承可以让代码重用,他现在定义一个基类shape,私有数据为坐标点x,y, 由它派生Rectangle类和Circle类,它们都有成员函数GetArea()求面积。派生类Rectangle类有数据:矩形的长和宽;派生类Circle类有数据:圆的半径。Rectangle类又派生正方形Square类,定义各类并测试。输入三组数据,分别是矩形的长和宽、圆的半径、正方形的边长,输出三组数据,分别是矩形、圆、正方形的面积。圆周率按3.14计算。

输入描述:
输入三行,
第一行为矩形的长和宽,
第二行为圆的半径,
第三行为正方形的边长。
输出描述:
三行,分别是矩形、圆、正方形的面积。

解题思路
主要考察虚函数,虚函数是动态绑定,在运行时绑定。根据数据的类型,来决定调用哪个。

代码

#include<iostream>

using namespace std;

class Shape//基类Shape
{
public:
    virtual float GetArea() { return 0.0; }//为了实现重用,将求面积函数GetArea定义为虚函数
};

class Rectangle : public Shape//派生类Rectangle,继承***pe
{
    int x;//私有成员x,y。class默认为私有的
    int y;
public:
    void setRectangle(int m, int n)//赋值给x和y
    {
        x = m;
        y = n;
    }
    virtual float GetArea() { return x * y; }//虚函数,根据数据类型决定调用哪一个
};

class Circle :public Shape
{
    int r;//私有成员r。class默认为私有的
public:
    void setCircle(int x)
    {
        r = x;
    }
    virtual float GetArea() { return r * r * 3.14; }//虚函数,根据数据类型决定调用哪一个
};

class Square :public Rectangle
{
    int m;//私有成员m。class默认为私有的
public:
    void setSquare(int x)
    {
        m = x;
    }
    virtual float GetArea() { return m * m; }//虚函数,根据数据类型决定调用哪一个
};

int main()
{
    Rectangle r;
    Circle c;
    Square s;
    int a, b, d, e;
    cin >> a >> b >> d >> e;
    r.setRectangle(a, b);
    c.setCircle(d);
    s.setSquare(e);
    cout<<r.GetArea()<<endl;
    cout<<c.GetArea()<<endl;
    cout<<s.GetArea()<<endl;
    return 0;
}