#include <iostream>
using namespace std;

class Base {
public:
  virtual bool method() { return false; } // Base is polymorphic
};

class Derived1: public Base {
public:
};

class Derived2: public Base {
public:
  bool method() { return true; }
};

class Derived3: public Base {
public:
};

Base *factory()
{
  switch(rand()  3 ) {
    case 0: return new Derived3;
    case 1: return new Derived1;
    case 2: return new Derived2;
  }
  return 0;
}

int main()
{
  Base *ptr;
  for(int i=0; i<10; i++) {
    ptr = factory(); // generate an object

    cout << "Object is " << typeid(*ptr).name();
    cout << endl;

    if(typeid(*ptr) == typeid(Derived3))
       cout << " Derived3";
    if(typeid(*ptr) == typeid(Derived1))
       cout << " Derived1";
    if(typeid(*ptr) == typeid(Derived2))
       cout << " Derived2";
  }
  return 0;
}
