如何使用虚拟类实现此初始化列表?

时间:2013-01-06 07:28:19

标签: c++ virtual

#include<iostream.h>  
class A{  
  public:  
        int i;  
            A(int j=3):i(j){}  
};  
class B:virtual public A{  
  public:  
        B(int j=2):A(j){}  
};  
class C:virtual public A{  
  public:  
        C(int j=1):A(j){}  
};  
class D:public B, public C {    
  public:  
        D(int j=0):A(j), B(j+1), C(j+2){}  
};

int main()  
{  
    D d;   
    cout<<d.i;  
    return 0;
}

我无法理解最终输出是如何为零。每次j以默认方式初始化为某个固定值时,如何将类D的构造函数中初始化的值传递给类A?

2 个答案:

答案 0 :(得分:2)

具有虚拟基础继承的规则是:

“层次结构中派生程度最高的类必须构建虚拟基础”

在您的情况下,来自派生程度最高的类D您通过传递参数A显式调用了0的构造函数,因此它将i设置为{{1} }}。如规则中所述,虚拟基类仅通过大多数派生类构造,而其他构造函数通过中间层次结构调用没有任何效果,因为它只构造一次。

通话顺序为:

0

好读:
Why virtual base class constructors called first?

答案 1 :(得分:2)

由于A是一个虚拟基类,因此它只应构造一次,因此无法使用不同的构造函数参数创建它,并且C ++编译器必须选择一种创建基类的方法。

显而易见的问题是:使用哪一个?

规则是:在最派生类中指定的直接继承A的那个。

初始化顺序很简单:首先是A(带有来自D构造函数初始化列表的参数值),然后是B(它是D的第一个祖先;它使用之前创建的A的实例),然后是C(并且它共享相同的A实例),最后是D(并且它也与B和C共享相同的A对象)。