// dynamic allocation and polymorphism
#include <iostream>
using namespace std;
class Polygon {
protected:
int width, height;
public:
Polygon (int a, int b) : width(a), height(b) {}
virtual int area (void) =0;
void printarea()
{ cout << this->area() << '\n'; }
};
class Rectangle: public Polygon {
public:
Rectangle(int a,int b) : Polygon(a,b) {}
int area()
{ return width*height; }
};
class Triangle: public Polygon {
public:
Triangle(int a,int b) : Polygon(a,b) {}
int area()
{ return width*height/2; }
};
int main () {
Polygon * ppoly1 = new Rectangle (4,5);
Polygon * ppoly2 = new Triangle (4,5);
ppoly1->printarea();
ppoly2->printarea();
delete ppoly1;
delete ppoly2;
return 0;
}
Ly8gZHluYW1pYyBhbGxvY2F0aW9uIGFuZCBwb2x5bW9ycGhpc20KI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgUG9seWdvbiB7CiAgcHJvdGVjdGVkOgogICAgaW50IHdpZHRoLCBoZWlnaHQ7CiAgcHVibGljOgogICAgUG9seWdvbiAoaW50IGEsIGludCBiKSA6IHdpZHRoKGEpLCBoZWlnaHQoYikge30KICAgIHZpcnR1YWwgaW50IGFyZWEgKHZvaWQpID0wOwogICAgdm9pZCBwcmludGFyZWEoKQogICAgICB7IGNvdXQgPDwgdGhpcy0+YXJlYSgpIDw8ICdcbic7IH0KfTsKCmNsYXNzIFJlY3RhbmdsZTogcHVibGljIFBvbHlnb24gewogIHB1YmxpYzoKICAgIFJlY3RhbmdsZShpbnQgYSxpbnQgYikgOiBQb2x5Z29uKGEsYikge30KICAgIGludCBhcmVhKCkKICAgICAgeyByZXR1cm4gd2lkdGgqaGVpZ2h0OyB9Cn07CgpjbGFzcyBUcmlhbmdsZTogcHVibGljIFBvbHlnb24gewogIHB1YmxpYzoKICAgIFRyaWFuZ2xlKGludCBhLGludCBiKSA6IFBvbHlnb24oYSxiKSB7fQogICAgaW50IGFyZWEoKQogICAgICB7IHJldHVybiB3aWR0aCpoZWlnaHQvMjsgfQp9OwoKaW50IG1haW4gKCkgewogIFBvbHlnb24gKiBwcG9seTEgPSBuZXcgUmVjdGFuZ2xlICg0LDUpOwogIFBvbHlnb24gKiBwcG9seTIgPSBuZXcgVHJpYW5nbGUgKDQsNSk7CiAgcHBvbHkxLT5wcmludGFyZWEoKTsKICBwcG9seTItPnByaW50YXJlYSgpOwogIGRlbGV0ZSBwcG9seTE7CiAgZGVsZXRlIHBwb2x5MjsKICByZXR1cm4gMDsKfQ==