#include <iostream>
#include <string>
using namespace std;
class Polygon
{
protected:
int width, height;
public:
Polygon (int a, int b) : width(a), height(b) {}
virtual ~Polygon() { }
virtual int area() = 0;
};
class Output
{
private:
std::string myString;
public:
Output() { }
Output(const string& s) : myString(s) { }
// This seems to work, but ther core dump happens right afterwards.
virtual ~Output() { }
virtual int area() = 0;
void print () {
cout << myString << this->area() << '\n';
}
};
class Rectangle: public Polygon, public Output
{
public:
Rectangle (int a, int b) : Polygon(a,b), Output{"A Rectangle's area is: "} {}
int area () {
return width*height;
}
};
class Triangle: public Polygon, public Output
{
public:
Triangle (int a, int b) : Polygon{a,b}, Output{"A Triangle's area is: "} {}
int area ()
{ return width*height/2; }
};
int main ()
{
Output * ptr1 = new Rectangle(4,5);
Output * ptr2 = new Triangle(4,5);
ptr1->print();
ptr2->print();
// Causes core dump.
delete ptr1;
delete ptr2;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFBvbHlnb24gCnsKICBwcm90ZWN0ZWQ6CiAgICBpbnQgd2lkdGgsIGhlaWdodDsKICBwdWJsaWM6CiAgICBQb2x5Z29uIChpbnQgYSwgaW50IGIpIDogd2lkdGgoYSksIGhlaWdodChiKSB7fQogICAgdmlydHVhbCB+UG9seWdvbigpIHsgfQogICAgdmlydHVhbCBpbnQgYXJlYSgpID0gMDsKfTsKCmNsYXNzIE91dHB1dCAKewogIHByaXZhdGU6CiAgICBzdGQ6OnN0cmluZyBteVN0cmluZzsKCiAgcHVibGljOgogICAgT3V0cHV0KCkgeyAgICB9CgogICAgT3V0cHV0KGNvbnN0IHN0cmluZyYgcykgOiBteVN0cmluZyhzKSB7ICAgfQoKICAgIC8vIFRoaXMgc2VlbXMgdG8gd29yaywgYnV0IHRoZXIgY29yZSBkdW1wIGhhcHBlbnMgcmlnaHQgYWZ0ZXJ3YXJkcy4KICAgIHZpcnR1YWwgfk91dHB1dCgpIHsgICAgfQogICAgdmlydHVhbCBpbnQgYXJlYSgpID0gMDsKICAgIHZvaWQgcHJpbnQgKCkgewogICAgICBjb3V0IDw8IG15U3RyaW5nIDw8IHRoaXMtPmFyZWEoKSA8PCAnXG4nOwogICAgfQp9OwoKCgpjbGFzcyBSZWN0YW5nbGU6IHB1YmxpYyBQb2x5Z29uLCBwdWJsaWMgT3V0cHV0IAp7CiAgcHVibGljOgogICAgUmVjdGFuZ2xlIChpbnQgYSwgaW50IGIpIDogUG9seWdvbihhLGIpLCBPdXRwdXR7IkEgUmVjdGFuZ2xlJ3MgYXJlYSBpczogIn0ge30KICAgIGludCBhcmVhICgpIHsKICAgICByZXR1cm4gd2lkdGgqaGVpZ2h0OwogICB9Cn07CgpjbGFzcyBUcmlhbmdsZTogcHVibGljIFBvbHlnb24sIHB1YmxpYyBPdXRwdXQgIAp7CiAgcHVibGljOgogICAgVHJpYW5nbGUgKGludCBhLCBpbnQgYikgOiBQb2x5Z29ue2EsYn0sIE91dHB1dHsiQSBUcmlhbmdsZSdzIGFyZWEgaXM6ICJ9IHt9CiAgICBpbnQgYXJlYSAoKQogICAgICB7IHJldHVybiB3aWR0aCpoZWlnaHQvMjsgfQp9OwoKaW50IG1haW4gKCkgCnsKICBPdXRwdXQgKiBwdHIxID0gbmV3IFJlY3RhbmdsZSg0LDUpOwogIE91dHB1dCAqIHB0cjIgPSBuZXcgVHJpYW5nbGUoNCw1KTsKCiAgcHRyMS0+cHJpbnQoKTsKICBwdHIyLT5wcmludCgpOwoKICAvLyBDYXVzZXMgY29yZSBkdW1wLiAgCiAgZGVsZXRlIHB0cjE7CiAgZGVsZXRlIHB0cjI7CgogIHJldHVybiAwOwp9