#include <string>

class Object {
 public:
  virtual std::string ToString() const = 0;
  virtual ~Object() {}
};

class Child : public Object {
 public:
  explicit Child(const std::string& class_id)
    : id_(class_id) {}
  Child() {}
  std::string ToString() const  override {
    return id_;
  }
 private:
  std::string id_;
};

class Factory {
 public:
  Object* Create(const std::string& class_id) {
    return new Child(class_id);
  }
  void Register(const std::string& class_id, Object*(*instance_creator)());
};