超类需要的信息多于初始化列表提供的信息

时间:2013-09-18 01:23:10

标签: c++ constructor initializer-list

我正试图找出一种在处理一些信息后调用超类构造函数的方法。我有像Foo和FooSubclass这样的东西,并希望做这样的事情。

class Foo{
    Info info;
    Foo::Foo(Info input){info = input};
}

class FooSubclass : public Foo{
    Info info;
    FooSubclass::FooSubclass(Info input){
        Info moreInput = unpackInput(input);
        Foo(moreInput);
    }
}

这样我在将它传递给超类构造函数之前在构造函数中解压缩一些信息。我认为目前C ++ 11中不允许这样做 - 还有另外一种方法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

假设您可以复制Info,您可以在函数中“解包”它,并将Info对象直接返回给基类的构造函数:

class FooSubclass
    : public Foo // it seems you mean to this as base class
{
    static Info unpackInput(Info input);
public:
    FooSubclass(Info input):
        Foo(unpackInput(input))
    {
    }
};

如果您确实需要存储一个对象,例如,因为复制/移动对象因任何原因都不可行(即使复制/移动可能被省略),您也可以使用virtual base进行操作课程(虽然不完全免费):

struct PrivateBase
{
    Info unpackedInput;
    PrivateBase(Info input)
        unpackedInput(input) {
        // do whatever else needs to be done to unpack the input
    }
};
class FooSubclass
    : private virtual PrivateBase, public Foo
{
public:
    FooSubclass(Info input)
        : PrivateBase(input) // this one is guaranteed to be constructed first!
        , Foo(unpackedInput)
    {
    }
};

当乘法继承基类时,基数的构造顺序按其声明的顺序排列。如果涉及virtual个基类,则在所有普通基类之前构造它们。在上面的示例中,首先简单地继承基类PrivateBase,以防止virtual层次结构中的Foo基类。如果不是这种情况,可以使用正常继承。

无论如何,由于基类构造函数是先执行的,因此它们可以[ab?]用于执行您想要注入的其他计算并设置任何必要的值。然后可以通过引用将它们传递给基类。

答案 1 :(得分:0)

基类cTors总是先执行。之后,派生类cTor将运行以提供最终的Derived类对象。

也许你可以在创建对象之前尝试在外部进行处理,然后将信息传递给基类。

为了使事情变得非常简单,请在所有cTors(基础和派生)

之外进行
Info moreInput = unpackInput(input);    

然后通过派生类cTor初始化列表将moreInput传递给Base类。