【问题标题】:What is the order of constructor call in virtual inheritance?虚拟继承中构造函数调用的顺序是什么?
【发布时间】:2016-05-15 06:52:11
【问题描述】:

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

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

(I)为以下代码,没有虚继承;

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;
}

输出是:

     a       b       a       b       c       a       b       c       d       e       f

(II)具有类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;
}

输出是:

     a       b       c       a       b       c       d       e       a       b       f

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

【问题讨论】:

    标签: c++ inheritance virtual


    【解决方案1】:

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

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

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

    Initialization order:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2015-06-21
      • 2012-04-12
      • 2013-01-29
      • 2011-11-24
      相关资源
      最近更新 更多