#include <iostream>
#include <typeinfo>

class Pet {
protected:
  Pet *nemesis;
public:  
  virtual void talk() = 0; // pure virtual  
  virtual void run() = 0;
};

class Dog : public Pet {
public:
  Dog(Pet *nem) { nemesis = nem; }
  void talk() { cout << "Woof" << endl; }
  void run() {}
};

class Cat : public Pet {
public:
  Cat(Pet *nem) { nemesis = nem; }
  void talk() { cout << "Meow" << endl; }
  void run() { 
    
    if (nemesis!=0) 
      if (typeid(*nemesis) == typeid(Dog)) 
	cout << "run" << endl;
    
      else 
	cout << "Who cares" << endl;
  }
};


int main() {
  Pet *p;
  p = new Cat(0);
  p->run(); 
}
