// POLYMORPHISM - late binding, pointer types assigned during execution

#include <iostream>

using namespace std;

class Base
{
  public:
    virtual void print() { cout << "Base" << endl; }
};

class New1: public Base
{
  public:
    void print() { cout << "New1" << endl; }
};

class New2: public Base
{
  public:
    void print() { cout << "New2" << endl; }
};

int main()
{
  Base * ptr;

  Base base;
  New1 new1;
  New2 new2;

  ptr = & base;
  ptr->print();

  ptr = & new1;
  ptr->print();

  ptr = & new2;
  ptr->print();

  return 0;
}

// OUTPUT:
// Base
// New1
// New2

// EOF