1

我试图找出一种在处理一些信息后调用超类构造函数的方法。我有类似 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 目前不允许这样做 - 还有另一种方法可以做到这一点吗?

谢谢。

4

2 回答 2

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基类玩一个技巧(这并不完全是不过免费):

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?]用于执行您想要注入的额外计算并设置任何必要的值。然后可以通过引用将这些传递给基类。

于 2013-09-18T01:27:55.277 回答
0

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

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

为了让事情变得非常简单,请在所有 cTor(基础和派生)之外执行此操作

Info moreInput = unpackInput(input);    

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

于 2013-09-18T03:16:46.267 回答