#include <iostream>
class Number
{
protected:
int magnitude_;
public:
static Number* fromInt(int x);
virtual ~Number() {}
int getMagnitude() { return magnitude_; }
virtual void print() = 0;
};
class PositiveNumber: public Number
{
public:
PositiveNumber(int magnitude) { magnitude_ = magnitude; }
void print() { std::cout << "positive " << magnitude_ << "\n"; }
};
class NegativeNumber: public Number
{
public:
NegativeNumber(int magnitude) { magnitude_ = magnitude; }
void print() { std::cout << "negative " << magnitude_ << "\n"; }
};
Number* Number::fromInt(int x)
{
if (x >= 0) { return new PositiveNumber(x); }
else { return new NegativeNumber(x); }
}
int main (int argc, char* argv[])
{
Number* x = Number::fromInt(5);
x->print();
delete x;
x = Number::fromInt(-5);
x->print();
delete x;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgTnVtYmVyCnsKcHJvdGVjdGVkOgogICAgaW50IG1hZ25pdHVkZV87CnB1YmxpYzoKICAgIHN0YXRpYyBOdW1iZXIqIGZyb21JbnQoaW50IHgpOwoKICAgIHZpcnR1YWwgfk51bWJlcigpIHt9CgogICAgaW50IGdldE1hZ25pdHVkZSgpIHsgcmV0dXJuIG1hZ25pdHVkZV87IH0KICAgIHZpcnR1YWwgdm9pZCBwcmludCgpID0gMDsKfTsKCmNsYXNzIFBvc2l0aXZlTnVtYmVyOiBwdWJsaWMgTnVtYmVyCnsKcHVibGljOgogICAgUG9zaXRpdmVOdW1iZXIoaW50IG1hZ25pdHVkZSkgeyBtYWduaXR1ZGVfID0gbWFnbml0dWRlOyB9CiAgICB2b2lkIHByaW50KCkgeyBzdGQ6OmNvdXQgPDwgInBvc2l0aXZlICIgPDwgbWFnbml0dWRlXyA8PCAiXG4iOyB9Cn07CgpjbGFzcyBOZWdhdGl2ZU51bWJlcjogcHVibGljIE51bWJlcgp7CnB1YmxpYzoKICAgIE5lZ2F0aXZlTnVtYmVyKGludCBtYWduaXR1ZGUpIHsgbWFnbml0dWRlXyA9IG1hZ25pdHVkZTsgfQogICAgdm9pZCBwcmludCgpIHsgc3RkOjpjb3V0IDw8ICJuZWdhdGl2ZSAiIDw8IG1hZ25pdHVkZV8gPDwgIlxuIjsgfQp9OwoKTnVtYmVyKiBOdW1iZXI6OmZyb21JbnQoaW50IHgpCnsKICAgIGlmICh4ID49IDApIHsgcmV0dXJuIG5ldyBQb3NpdGl2ZU51bWJlcih4KTsgfQogICAgZWxzZSAgICAgICAgeyByZXR1cm4gbmV3IE5lZ2F0aXZlTnVtYmVyKHgpOyB9Cn0KCmludCBtYWluIChpbnQgYXJnYywgY2hhciogYXJndltdKQp7CiAgICBOdW1iZXIqIHggPSBOdW1iZXI6OmZyb21JbnQoNSk7CiAgICB4LT5wcmludCgpOwogICAgZGVsZXRlIHg7CgogICAgeCA9IE51bWJlcjo6ZnJvbUludCgtNSk7CiAgICB4LT5wcmludCgpOwogICAgZGVsZXRlIHg7CgogICAgcmV0dXJuIDA7Cn0=