C++ 超类需要比初始化列表提供的更多的信息

C++ 超类需要比初始化列表提供的更多的信息,c++,constructor,initializer-list,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 =

我正在试图找到一种方法,在处理一些信息后调用一个超类构造函数。我有一些像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中是不允许的-有其他方法可以做到这一点吗


谢谢。

假设您可以复制
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
基类玩把戏(尽管基类并非完全免费):

当乘法继承基类时,基类的构造顺序与它们声明的顺序相同。如果涉及到
虚拟
基类,则在所有正常基类之前构造这些基类。在上面的示例中,只需首先继承基类
PrivateBase
,以防止
virtual
基类位于
Foo
层次结构中。如果不是这样,则可以使用普通继承


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

假设您可以复制
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
基类玩把戏(尽管基类并非完全免费):

当乘法继承基类时,基类的构造顺序与它们声明的顺序相同。如果涉及到
虚拟
基类,则在所有正常基类之前构造这些基类。在上面的示例中,只需首先继承基类
PrivateBase
,以防止
virtual
基类位于
Foo
层次结构中。如果不是这样,则可以使用普通继承


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

基类构造函数始终首先执行。之后,派生类cTor将运行,以提供最终的派生类对象

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

要使事情非常简单,请在所有的系数(基和派生)之外执行此操作


然后通过派生类cTor初始值设定项列表将moreInput传递给基类

基类构造函数总是首先执行。之后,派生类cTor将运行,以提供最终的派生类对象

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

要使事情非常简单,请在所有的系数(基和派生)之外执行此操作


然后通过派生类cTor初始值设定项列表将moreInput传递给基类

只能在初始化列表中调用超类构造函数。试试看,只要
解压输入
不是虚拟的,它就可以工作;我认为在另一条评论中也建议这样做。您只在初始化列表中调用超类构造函数。试试看,只要
解压输入
不是虚拟的,它就可以工作;我想这也是在另一篇评论中推荐的。我的意思是把foo作为基类。谢谢。谢谢你的帮助马修和迪特玛;我相信这是有效的。我的意思是把foo作为基类。谢谢。谢谢你的帮助马修和迪特玛;我相信这是可行的。
Info moreInput = unpackInput(input);