#include <iostream>
class IBase {
public:
virtual void report() const = 0;
virtual IBase * instance() const = 0;
};
template <typename Derived>
class Builder : public IBase {
public:
IBase *instance() const {
return new Derived;
}
};
class B : public Builder<B> {
public:
virtual void report() const {
std::cout << "B" << std::endl;
}
};
class C : public Builder<C> {
public:
virtual void report() const {
std::cout << "C" << std::endl;
}
};
int main() {
IBase *b = new B;
IBase *c = new C;
b->report();
c->report();
IBase *b1 = b->instance();
IBase *c1 = c->instance();
b1->report();
c1->report();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgSUJhc2UgewpwdWJsaWM6CiAgdmlydHVhbCB2b2lkIHJlcG9ydCgpIGNvbnN0ID0gMDsKICB2aXJ0dWFsIElCYXNlICogaW5zdGFuY2UoKSBjb25zdCA9IDA7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KY2xhc3MgQnVpbGRlciA6IHB1YmxpYyBJQmFzZSB7CnB1YmxpYzogIAogIElCYXNlICppbnN0YW5jZSgpIGNvbnN0IHsKICAgIHJldHVybiBuZXcgRGVyaXZlZDsKICB9Cn07CgpjbGFzcyBCIDogcHVibGljIEJ1aWxkZXI8Qj4gewpwdWJsaWM6CiAgdmlydHVhbCB2b2lkIHJlcG9ydCgpIGNvbnN0IHsKICAgIHN0ZDo6Y291dCA8PCAiQiIgPDwgc3RkOjplbmRsOwogIH0KfTsKCmNsYXNzIEMgOiBwdWJsaWMgQnVpbGRlcjxDPiB7CnB1YmxpYzoKICB2aXJ0dWFsIHZvaWQgcmVwb3J0KCkgY29uc3QgewogICAgc3RkOjpjb3V0IDw8ICJDIiA8PCBzdGQ6OmVuZGw7CiAgfQp9OwoKaW50IG1haW4oKSB7CiAgSUJhc2UgKmIgPSBuZXcgQjsKICBJQmFzZSAqYyA9IG5ldyBDOwogIAogIGItPnJlcG9ydCgpOwogIGMtPnJlcG9ydCgpOwogIAogIElCYXNlICpiMSA9IGItPmluc3RhbmNlKCk7CiAgSUJhc2UgKmMxID0gYy0+aW5zdGFuY2UoKTsKICAKICBiMS0+cmVwb3J0KCk7CiAgYzEtPnJlcG9ydCgpOwp9