#include <iostream>
struct Base
{
virtual void mem_f() = 0;
virtual ~Base() {};
};
template <class T>
struct Derived;
template <>
struct Derived<std::string> : public Base
{
virtual void mem_f() { std::cout << "Derived<std::string>::mem_f()\n"; };
};
template <>
struct Derived<int> : public Base
{
virtual void mem_f() { std::cout << "Derived<int>::mem_f()\n"; };
};
Base* menu()
{
int x; std::cin >> x;
if (x == 42) {
return new Derived<std::string>;
}
return new Derived<int>;
}
int main()
{
Base *base1 = menu();
base1->mem_f();
Base *base2 = menu();
base2->mem_f();
delete base1;
delete base2;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEJhc2UKewoJdmlydHVhbCB2b2lkIG1lbV9mKCkgPSAwOwoJdmlydHVhbCB+QmFzZSgpIHt9Owp9OwoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCBEZXJpdmVkOwoKdGVtcGxhdGUgPD4Kc3RydWN0IERlcml2ZWQ8c3RkOjpzdHJpbmc+IDogcHVibGljIEJhc2UKewoJdmlydHVhbCB2b2lkIG1lbV9mKCkgeyBzdGQ6OmNvdXQgPDwgIkRlcml2ZWQ8c3RkOjpzdHJpbmc+OjptZW1fZigpXG4iOyB9Owp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IERlcml2ZWQ8aW50PiA6IHB1YmxpYyBCYXNlCnsKCXZpcnR1YWwgdm9pZCBtZW1fZigpIHsgc3RkOjpjb3V0IDw8ICJEZXJpdmVkPGludD46Om1lbV9mKClcbiI7IH07Cn07CgpCYXNlKiBtZW51KCkKewoJaW50IHg7IHN0ZDo6Y2luID4+IHg7CglpZiAoeCA9PSA0MikgewoJCXJldHVybiBuZXcgRGVyaXZlZDxzdGQ6OnN0cmluZz47Cgl9CglyZXR1cm4gbmV3IERlcml2ZWQ8aW50PjsKfQppbnQgbWFpbigpCnsKCUJhc2UgKmJhc2UxID0gbWVudSgpOwoJYmFzZTEtPm1lbV9mKCk7CgoJQmFzZSAqYmFzZTIgPSBtZW51KCk7CgliYXNlMi0+bWVtX2YoKTsKCglkZWxldGUgYmFzZTE7CglkZWxldGUgYmFzZTI7CiAgICByZXR1cm4gMDsKfQo=