所以我有一个基类Base和一些子类。我想要做的是有一个基类构造函数,它根据字符串参数创建一个子类,如:
Base:Base(string class_name) {
switch(class_name) {
case "something":
*this = SomeChildClass(...);
...
}
}
这编译并运行但该对象没有子类的特性,我不明白为什么。这不应该起作用吗?
答案 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>();
}
}
};
请注意,通常,多态性需要动态对象分配(或某些非常特定方案),因此唯一指针作为返回类型。