#include <iostream>
class A {
public:
virtual void report() const {
std::cout << "A" << std::endl;
}
virtual A *instance() const {
return new A;
}
};
class B : public A {
public:
virtual void report() const {
std::cout << "B" << std::endl;
}
B *instance() const {
return new B;
}
};
class C : public A {
public:
virtual void report() const {
std::cout << "C" << std::endl;
}
C *instance() const {
return new C;
}
};
int main() {
A *a = new A;
A *b = new B;
A *c = new C;
A *a1 = a->instance();
A *b1 = b->instance();
A *c1 = c->instance();
a->report();
b->report();
c->report();
a1->report();
b1->report();
c1->report();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQSB7CnB1YmxpYzoKICB2aXJ0dWFsIHZvaWQgcmVwb3J0KCkgY29uc3QgewogICAgc3RkOjpjb3V0IDw8ICJBIiA8PCBzdGQ6OmVuZGw7CiAgfQoKICB2aXJ0dWFsIEEgKmluc3RhbmNlKCkgY29uc3QgewogICAgcmV0dXJuIG5ldyBBOwogIH0KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQSB7CnB1YmxpYzoKICB2aXJ0dWFsIHZvaWQgcmVwb3J0KCkgY29uc3QgewogICAgc3RkOjpjb3V0IDw8ICJCIiA8PCBzdGQ6OmVuZGw7CiAgfQoKICBCICppbnN0YW5jZSgpIGNvbnN0IHsKICAgIHJldHVybiBuZXcgQjsKICB9Cn07CgpjbGFzcyBDIDogcHVibGljIEEgewpwdWJsaWM6CiAgdmlydHVhbCB2b2lkIHJlcG9ydCgpIGNvbnN0IHsKICAgIHN0ZDo6Y291dCA8PCAiQyIgPDwgc3RkOjplbmRsOwogIH0KCiAgQyAqaW5zdGFuY2UoKSBjb25zdCB7CiAgICByZXR1cm4gbmV3IEM7CiAgfQp9OwoKaW50IG1haW4oKSB7CiAgQSAqYSA9IG5ldyBBOwogIEEgKmIgPSBuZXcgQjsKICBBICpjID0gbmV3IEM7CgogIEEgKmExID0gYS0+aW5zdGFuY2UoKTsKICBBICpiMSA9IGItPmluc3RhbmNlKCk7CiAgQSAqYzEgPSBjLT5pbnN0YW5jZSgpOwoKICBhLT5yZXBvcnQoKTsKICBiLT5yZXBvcnQoKTsKICBjLT5yZXBvcnQoKTsKCiAgYTEtPnJlcG9ydCgpOwogIGIxLT5yZXBvcnQoKTsKICBjMS0+cmVwb3J0KCk7Cn0KCg==