使用基类构造函数初始化子类

时间:2018-04-03 10:55:57

标签: c++ c++11

所以我有一个基类Base和一些子类。我想要做的是有一个基类构造函数,它根据字符串参数创建一个子类,如:

Base:Base(string class_name) {
    switch(class_name) {
        case "something":
            *this = SomeChildClass(...);
            ...
    }
}

这编译并运行但该对象没有子类的特性,我不明白为什么。这不应该起作用吗?

1 个答案:

答案 0 :(得分:3)

您无法在构造函数中执行此操作,因为构造函数始终构造特定类型的对象。但是,使用工厂函数执行此操作是一种非常常见的模式,可能是这样的:

class Base
{
public:
  static std::unique_ptr<Base> create(const std::string &class_name) {
    if (class_name == "something") {
      return std::make_unique<SomeChildClass>();
    }
  }
};

请注意,通常,多态性需要动态对象分配(或某些非常特定方案),因此唯一指针作为返回类型。