#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;
}