#include <iostream>
#include <map>
#include <functional>
struct A
{
virtual void f() = 0;
};
struct B : public A
{
void f() { std::cout << "B::f\n"; }
};
struct C : public A
{
void f() { std::cout << "C::f\n"; }
};
B* getB() { return new B; }
C* getC() { return new C; }
int main()
{
std::map<std::string, std::function<A*()>> m;
m["b"] = getB;
m["c"] = getC;
m["b"]()->f();
m["c"]()->f();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0cnVjdCBBCnsKICAgIHZpcnR1YWwgdm9pZCBmKCkgPSAwOwp9OwoKc3RydWN0IEIgOiBwdWJsaWMgQQp7CiAgICB2b2lkIGYoKSB7IHN0ZDo6Y291dCA8PCAiQjo6ZlxuIjsgfQp9OwoKc3RydWN0IEMgOiBwdWJsaWMgQQp7CiAgICB2b2lkIGYoKSB7IHN0ZDo6Y291dCA8PCAiQzo6ZlxuIjsgfQp9OwoKQiogZ2V0QigpIHsgcmV0dXJuIG5ldyBCOyB9CkMqIGdldEMoKSB7IHJldHVybiBuZXcgQzsgfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpmdW5jdGlvbjxBKigpPj4gbTsKICAgIG1bImIiXSA9IGdldEI7CiAgICBtWyJjIl0gPSBnZXRDOwoKICAgIG1bImIiXSgpLT5mKCk7CiAgICBtWyJjIl0oKS0+ZigpOwp9Cg==