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