在孩子的创作中避免构造函数重复

时间:2020-04-15 19:46:19

标签: c++ inheritance constructor polymorphism virtual

我有一个父班和多个子班。我想根据输入动态创建不同类的子对象。

假定父级是这样声明的:

class Parent {
public:
    Parent(int v);
};

ChildOnEChildTwo都继承Parent。是否存在以下快捷方式:

shared_ptr<Parent> myObject;
switch(input) {
    case 1: {
        myObject = make_shared<ChildOne>(int v);
        break;
    }
    case 2: {
        myObject = make_shared<ChildTwo>(int v);
        break;
    }
}

在处理两个以上的子对象时,这尤其繁重,尤其是在构造函数以相同方式构造时。我们不能以某种方式复制纯虚拟构造函数的行为,以便所有子对象都必须实现它,然后只更改所调用的类,而不更改参数吗?

TL; DR 如何缩短上述示例?

1 个答案:

答案 0 :(得分:1)

您可以创建一个查找表;像这样:

using Ctor = shared_ptr<Parent>(int v);

static const std::map<int, Ctor *> ctors = {
    {1, (Ctor *)make_shared<ChildOne>}, // The cast chooses overload;
    {2, (Ctor *)make_shared<ChildTwo>}, // not sure is that necessary in such context
};

...
return (ctors.at(input))(v);

这里的妙处在于,尽管构造函数是特殊的,并且不能采用其地址,但是make_shared是可以自由传递的常规函数​​指针。