虚拟继承:Base Ctor没有调用Most Derived Class?

时间:2010-03-10 12:48:21

标签: c++ inheritance multiple-inheritance virtual-inheritance

class Base
{
      public:
          Base(){}
          Base(int k):a(k) 
          {     
          }
            int a;
};

class X:virtual public Base
{
      public:
            X():Base(10){}
            int x;
};

class Y:virtual public Base
{
      public:
            Y():Base(10){}
            int y;
};

class Z:public X,public Y
{
public:
    Z():X(10){}
};

int main()
{
           Z a;
           cout << a.a;
           return 1;
}

在上述情况下,Z():X(10){} Base(int k):a(k)未调用,但当我更改为Z():Base(10){}时,Base(int k):a(k)被调用。为什么?

谢谢。

3 个答案:

答案 0 :(得分:7)

因为您使用了virtual关键字 - 这正是它所做的。

您必须在Base的初始值设定项列表中明确初始化Z,以消除X中的初始化和Y中的初始化之间的歧义。

答案 1 :(得分:3)

this question。要点是,在使用虚拟继承时,必须显式调用基类构造函数。

答案 2 :(得分:0)

最派生的构造函数中的初始化列表用于初始化基类。由于类Z继承自继承自公共基类的类X和Y,因此virtual关键字仅用于为基类创建单个子对象,以便在访问数据成员时消除歧义。