2

如果我定义一个从多个其他结构继承的结构,我列出它们的顺序如何影响这样的事情:

struct D: C,B{
    D(): B(), C(){...}
};

简单的问题,但提前谢谢!

4

1 回答 1

1

构造顺序取决于继承顺序。初始化顺序无关紧要。在这种情况下,GCC 实际上会发出警告。

在构造函数“D::D()”中:

main.cpp:16:17: 警告:基础 'B' 将在 [-Wreorder] 之后初始化

 D(): B(), C(){
             ^

main.cpp:16:17: 警告:base 'C' [-Wreorder]

main.cpp:16:5:警告:在此处初始化时 [-Wreorder]

 D(): B(), C(){

标准中也有明确规定。从第 12.6.2 节初始化基础和成员

初始化应按以下顺序进行:

— 首先,并且仅对于如下所述的最派生类的构造函数,虚拟基类应按照它们在基类的有向无环图的深度优先从左到右遍历中出现的顺序进行初始化,其中“从左到右”是派生类基说明符列表中基类名称的出现顺序。
— 然后,直接基类应按照它们出现在 base-specifier-list 中的声明顺序进行初始化(无论 mem-initializers 的顺序如何)。

于 2013-09-21T04:59:21.617 回答