#include <cstdio>
#include <memory>
using namespace std;
class A1 {
public:
A1() { printf("A1\n"); }
virtual ~A1() { printf("~A1\n"); }
virtual void p() = 0;
};
class B1 : public A1 {
public:
void p() { printf("1\n"); }
};
class B2 : public A1 {
public:
void p() { printf("2\n"); }
};
class B3 : public A1 {
public:
void p() { printf("3\n"); }
};
int main() {
shared_ptr<A1> pointer(new B1);
pointer->p();
pointer.reset(new B2);
pointer->p();
pointer.reset(new B3);
(*pointer).p();
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPG1lbW9yeT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApjbGFzcyBBMSB7CiAgICBwdWJsaWM6CiAgICBBMSgpIHsgcHJpbnRmKCJBMVxuIik7IH0KICAgIHZpcnR1YWwgfkExKCkgeyBwcmludGYoIn5BMVxuIik7IH0KICAgIAogICAgdmlydHVhbCB2b2lkIHAoKSA9IDA7Cn07CiAKY2xhc3MgQjEgOiBwdWJsaWMgQTEgewogICAgcHVibGljOgogICAgdm9pZCBwKCkgeyBwcmludGYoIjFcbiIpOyB9Cn07CiAKY2xhc3MgQjIgOiBwdWJsaWMgQTEgewogICAgcHVibGljOgogICAgdm9pZCBwKCkgeyBwcmludGYoIjJcbiIpOyB9Cn07CiAKY2xhc3MgQjMgOiBwdWJsaWMgQTEgewogICAgcHVibGljOgogICAgdm9pZCBwKCkgeyBwcmludGYoIjNcbiIpOyB9Cn07CiAKaW50IG1haW4oKSB7CiAgICBzaGFyZWRfcHRyPEExPiBwb2ludGVyKG5ldyBCMSk7CiAgICBwb2ludGVyLT5wKCk7CiAgICAKICAgIHBvaW50ZXIucmVzZXQobmV3IEIyKTsKICAgIHBvaW50ZXItPnAoKTsKICAgIAogICAgcG9pbnRlci5yZXNldChuZXcgQjMpOwogICAgKCpwb2ludGVyKS5wKCk7CiAgICAKICAgIHJldHVybiAwOwp9