// Start the program
// Create the base class and declare the data member under protected access specifier and declare the function
// Create the derived class and access the base class data members in the derived class
// Create the object for derived class
// Call the public member function of the derived class
// Compile and run the program

#include <iostream.h>

#include<string.h>

#include <conio.h>

class Shape
{

    double width;

    double height;

    char name[20];

public:

    Shape()
    {
        width = height = 0.0;
        strcpy(name, "unknown");
    }

    Shape(double w, double h, char *n)
    {
        width = w;
        height = h;
        strcpy(name, n);
    }

    Shape(double x, char *n)
    {
        width = height = x;
        strcpy(name, n);
    }

    void display()
    {
        cout << "Width and height are " << width << " and " << height << "\n";
    }

    double getWidth()
    {
        return width;
    }

    double getHeight()
    {
        return height;
    }

    void setWidth(double w)
    {
        width = w;
    }

    void setHeight(double h)
    {
        height = h;
    }

    char *getName()
    {
        return name;
    }

    virtual double area() = 0;

};

class Triangle : public Shape
{

    char style[20];

public:

    Triangle()
    {
        strcpy(style, "unknown");
    }

    Triangle(char *str, double w, double h) : Shape(w, h, "triangle")
    {
        strcpy(style, str);
    }

    Triangle(double x) : Shape(x, "triangle")
    {
        strcpy(style, "isosceles");
    }

    double area()
    {
        return getWidth() * getHeight() / 2;
    }

    void showStyle()
    {
        cout << "Triangle is " << style << "\n";
    }

};

class Rectangle : public Shape
{

public:

    Rectangle(double w, double h) : Shape(w, h, "rectangle") { }

    Rectangle(double x) : Shape(x, "rectangle") { }

    bool isSquare()
    {
        if(getWidth() == getHeight())
            return true;
        return false;
    }

    double area()
    {
        return getWidth() * getHeight();
    }

};

int main()
{
    Shape *shapes[4];
    shapes[0] = &Triangle("right", 8.0, 12.0);
    shapes[1] = &Rectangle(10);
    shapes[2] = &Rectangle(10, 4);
    shapes[3] = &Triangle(7.0);
    for(int i=0; i < 4; i++)
        {
            cout << "object is " << shapes[i]->getName() << "\n";
            cout << "Area is " << shapes[i]->area() << "\n\n";
        }
    return 0;
}

