虚拟继承中构造函数调用的顺序是什么? < C++中虚拟继承中构造函数调用的顺序是什么?

虚拟继承中构造函数调用的顺序是什么? < C++中虚拟继承中构造函数调用的顺序是什么?,c++,inheritance,virtual,C++,Inheritance,Virtual,对于以下两种情况的多重继承 class a { public: a() { cout<<"\t a"; } }; class b: public a { public: b() { cout<<"\t b"; } }; class c: public b { public: c

对于以下两种情况的多重继承

class a
{
    public: 

        a()
        {
            cout<<"\t a";
        }

};

class b: public a
{
    public:
        b()
        {
            cout<<"\t b";
        }

};

class c: public b
{
    public:

        c()
        {
            cout<<"\t c";
        }

};

class d: public c
{
    public:

        d()
        {
            cout<<"\t d";
        }
};

class e: public c, public d
{
    public:

        e()
        {
            cout<<"\t e";
        }
};

class f: public b, public e
{
    public:

        f()
        {
            cout<<"\t f";
        }
};


int main()
{

    f aaa;

    return 0;
}
(一) 对于以下代码,没有虚拟继承

class a
{
    public: 

        a()
        {
            cout<<"\t a";
        }

};

class b: public a
{
    public:
        b()
        {
            cout<<"\t b";
        }

};

class c: public b
{
    public:

        c()
        {
            cout<<"\t c";
        }

};

class d: public c
{
    public:

        d()
        {
            cout<<"\t d";
        }
};

class e: public c, public d
{
    public:

        e()
        {
            cout<<"\t e";
        }
};

class f: public b, public e
{
    public:

        f()
        {
            cout<<"\t f";
        }
};


int main()
{

    f aaa;

    return 0;
}
(二) 使用类e的虚拟继承:

class a
{
    public: 

        a()
        {
            cout<<"\t a";
        }

};

class b: public a
{
    public:
        b()
        {
            cout<<"\t b";
        }

};

class c: public b
{
    public:

        c()
        {
            cout<<"\t c";
        }

};

class d: public c
{
    public:

        d()
        {
            cout<<"\t d";
        }
};

class e: public c, public d
{
    public:

        e()
        {
            cout<<"\t e";
        }
};

class f: public b, public virtual e
{
    public:

        f()
        {
            cout<<"\t f";
        }
};


int main()
{

    f aaa;

    return 0;
}
有人能解释一下在这两种情况下是如何获得输出的吗?
虚拟继承如何影响对象的构造?

将首先初始化虚拟基类,否则,将按照基类声明的从左到右顺序初始化直接基类

对于类
f
类f:public b,public e
,没有虚拟基类,直接基类
b
将首先初始化,然后
e
。(从左到右顺序)

对于
class f:public b,public virtual e
,将首先初始化虚拟基类
e
,然后初始化
b

见:

1) 如果构造函数用于派生最多的类,则为virtual base 类按照它们在中出现的顺序进行初始化 基类声明的深度优先从左到右遍历 (从左到右表示基本说明符列表中的外观)

2) 然后,按从左到右的顺序初始化直接基类,如下所示 它们出现在此类的基本说明符列表中

3) 然后,按照以下顺序初始化非静态数据成员: 类定义中的声明

4) 最后,执行构造函数的主体

     a       b       c       a       b       c       d       e       a       b       f