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

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

谢谢你。

4

3 回答 3

7

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

您必须Base在初始化列表中显式初始化Z,以便消除 in 中的初始化和 in 中的初始化之间的X歧义Y

于 2010-03-10T12:52:11.430 回答
3

看到这个问题。要点是,当使用虚拟继承时,您必须显式调用基类构造函数。

于 2010-03-10T12:50:49.670 回答
0

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

于 2010-03-10T14:25:37.217 回答