c++面向对象,求大神解答,谢谢啦

编写一个程序,声明抽象基类Shape(内含纯虚函数virtual double area()=0),由它派生出3个派生类: Circle(圆形: 增加数据成员r(半径)、公有成员有构造函数及求圆面积的函数area()函数);Rectangle(矩形:新增数据成员side(边长),公有成员有构造函数和求正方形面积的area()函数);Triangle(三角形:新增数据成员side(底边长)、height(底边上的高),公有成员有构造函数和求三角形面积的area()函数)。要求编写程序,用一个函数void printArea(const Shape *p),分别输出以上三者的面积,3个图形的数据在定义对象时给定。

答案如下:

class Shape
{
public:
    Shape() {}
    ~Shape() {}
    virtual double area() const = 0;
};

class Circle :public Shape
{
public:
    Circle(const double R) { r = R; }
    ~Circle() {}
    virtual double area() const { return 3.14 * r * r; }
public:
    double r;
};

class Rectangle :public Shape
{
public:
    Rectangle(double S) { side = S; }
    ~Rectangle() {}
    virtual double area() const { return side * side; }
public:
    double side;
};

class Triangle :public Shape
{
public:
    Triangle(double S, double H) { side = S; height = H; }
    ~Triangle() {}
    virtual double area() const { return  1.0 / 2.0 * side * height; }
public:
    double side;
    double height;
};

void printArea(const Shape* p)
{
    std::cout << "面积为:" << p->area()<<std::endl;
}

int main()
{
    Shape* p = new Circle(5);
    printArea(p);

    if (p != NULL)
    {
        delete p;
        p = NULL;
    }

    if (p == NULL)
    {
        p = new Rectangle(6);
        printArea(p);
    }

    if (p != NULL)
    {
        delete p;
        p = NULL;
    }

    if (p == NULL)
    {
        p = new Triangle(5,10);
        printArea(p);
    }

    if (p != NULL)
    {
        delete p;
        p = NULL;
    }
}