#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
class Polygon
{
public:
virtual unsigned int Area() const = 0;
};
class Rectangle : public Polygon
{
public:
Rectangle() : m_width(1), m_height(1) { }
Rectangle(unsigned int h, unsigned int w) : m_width(w), m_height(h)
{ }
Rectangle(const Rectangle& r) : m_width(r.m_width), m_height(r.m_height)
{ }
virtual ~Rectangle()
{ }
Rectangle& operator= (Rectangle r)
{
std::swap(*this, r);
return *this;
}
virtual unsigned int Area() const
{
return m_width * m_height;
}
private:
unsigned int m_width;
unsigned int m_height;
};
class Triangle : public Polygon
{
public:
Triangle() : m_base(1), m_height(1) { }
Triangle(unsigned int h, unsigned int b) : m_base(b), m_height(h)
{ }
Triangle(const Triangle& r) : m_base(r.m_base), m_height(r.m_height)
{ }
virtual ~Triangle()
{ }
Triangle& operator= (Triangle r)
{
std::swap(*this, r);
return *this;
}
virtual unsigned int Area() const
{
return m_base * m_height / 2;
}
private:
unsigned int m_base;
unsigned int m_height;
};
std::ostream& operator<<(std::ostream& os, const Rectangle& r)
{
os << "Area of rectangle is: " << r.Area();
return os;
}
std::ostream& operator<<(std::ostream& os, const Triangle& r)
{
os << "Area of Triangle is: " << r.Area();
return os;
}
int main()
{
Rectangle r(4, 5);
Triangle t(4, 5);
std::cout << r << "\n" << t << "\n";
std::vector<std::unique_ptr<Polygon>> v;
v.emplace_back(new Rectangle(4, 5));
v.emplace_back(new Triangle(4, 5));
std::for_each(v.begin(), v.end(), [](const std::unique_ptr<Polygon>& p)
{
std::cout << "Area of this polygon is " << p->Area() << "\n";
});
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgUG9seWdvbgp7CnB1YmxpYzoKCXZpcnR1YWwgdW5zaWduZWQgaW50IEFyZWEoKSBjb25zdCA9IDA7Cn07CgpjbGFzcyBSZWN0YW5nbGUgOiBwdWJsaWMgUG9seWdvbgp7CnB1YmxpYzoKICAgIFJlY3RhbmdsZSgpIDogbV93aWR0aCgxKSwgbV9oZWlnaHQoMSkgeyB9CgogICAgUmVjdGFuZ2xlKHVuc2lnbmVkIGludCBoLCB1bnNpZ25lZCBpbnQgdykgOiBtX3dpZHRoKHcpLCBtX2hlaWdodChoKQoJeyB9CgkKCVJlY3RhbmdsZShjb25zdCBSZWN0YW5nbGUmIHIpIDogbV93aWR0aChyLm1fd2lkdGgpLCBtX2hlaWdodChyLm1faGVpZ2h0KQoJeyB9CgkKCXZpcnR1YWwgflJlY3RhbmdsZSgpCgl7IH0KCQoJUmVjdGFuZ2xlJiBvcGVyYXRvcj0gKFJlY3RhbmdsZSByKQoJewoJICAgIHN0ZDo6c3dhcCgqdGhpcywgcik7CgkJcmV0dXJuICp0aGlzOwoJfQoJCgl2aXJ0dWFsIHVuc2lnbmVkIGludCBBcmVhKCkgY29uc3QKCXsKCSAgICByZXR1cm4gbV93aWR0aCAqIG1faGVpZ2h0OwoJfQoJCnByaXZhdGU6CiAgICB1bnNpZ25lZCBpbnQgbV93aWR0aDsKCXVuc2lnbmVkIGludCBtX2hlaWdodDsKfTsKCmNsYXNzIFRyaWFuZ2xlIDogcHVibGljIFBvbHlnb24KewpwdWJsaWM6CiAgICBUcmlhbmdsZSgpIDogbV9iYXNlKDEpLCBtX2hlaWdodCgxKSB7IH0KCiAgICBUcmlhbmdsZSh1bnNpZ25lZCBpbnQgaCwgdW5zaWduZWQgaW50IGIpIDogbV9iYXNlKGIpLCBtX2hlaWdodChoKQoJeyB9CgkKCVRyaWFuZ2xlKGNvbnN0IFRyaWFuZ2xlJiByKSA6IG1fYmFzZShyLm1fYmFzZSksIG1faGVpZ2h0KHIubV9oZWlnaHQpCgl7IH0KCQoJdmlydHVhbCB+VHJpYW5nbGUoKQoJeyB9CgkKCVRyaWFuZ2xlJiBvcGVyYXRvcj0gKFRyaWFuZ2xlIHIpCgl7CgkgICAgc3RkOjpzd2FwKCp0aGlzLCByKTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgkKCXZpcnR1YWwgdW5zaWduZWQgaW50IEFyZWEoKSBjb25zdAoJewoJICAgIHJldHVybiBtX2Jhc2UgKiBtX2hlaWdodCAvIDI7Cgl9CgkKcHJpdmF0ZToKICAgIHVuc2lnbmVkIGludCBtX2Jhc2U7Cgl1bnNpZ25lZCBpbnQgbV9oZWlnaHQ7Cn07CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgUmVjdGFuZ2xlJiByKQp7CiAgICBvcyA8PCAiQXJlYSBvZiByZWN0YW5nbGUgaXM6ICAiIDw8IHIuQXJlYSgpOwoJcmV0dXJuIG9zOwp9CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVHJpYW5nbGUmIHIpCnsKICAgIG9zIDw8ICJBcmVhIG9mIFRyaWFuZ2xlIGlzOiAgIiA8PCByLkFyZWEoKTsKCXJldHVybiBvczsKfQoKaW50IG1haW4oKQp7CiAgICBSZWN0YW5nbGUgcig0LCA1KTsKCVRyaWFuZ2xlIHQoNCwgNSk7CglzdGQ6OmNvdXQgPDwgciA8PCAiXG4iIDw8IHQgPDwgIlxuIjsKCQoJc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFBvbHlnb24+PiB2OwoJdi5lbXBsYWNlX2JhY2sobmV3IFJlY3RhbmdsZSg0LCA1KSk7Cgl2LmVtcGxhY2VfYmFjayhuZXcgVHJpYW5nbGUoNCwgNSkpOwoJc3RkOjpmb3JfZWFjaCh2LmJlZ2luKCksIHYuZW5kKCksIFtdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxQb2x5Z29uPiYgcCkKCXsKCQlzdGQ6OmNvdXQgPDwgIkFyZWEgb2YgdGhpcyBwb2x5Z29uIGlzICIgPDwgcC0+QXJlYSgpIDw8ICJcbiI7Cgl9KTsKICAgIHJldHVybiAwOwp9