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