#include <iostream>

using namespace std;
class SBase
{
  virtual void work()=0;
};

class PBase
{
  virtual void doit(SBase&)=0;
};
class P1: public PBase
{
  public:
  void doit(SBase&s) {cout << "P1" << '\t' << &s <<'\n';};
};
class P2: public P1
{
  public:
  void doit(SBase&s) {cout << "P2" << '\t' << &s <<'\n';};
};

class S : public SBase
{
  public:
  void work() {
  P1 p1;
  P2 p2;
  p1.doit(*this);
  p2.doit(*this);
  }
};

int main()
{
    S s;
    s.work();
    return 0;
}
