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)
被调用。为什么?
谢谢。
答案 0 :(得分:7)
因为您使用了virtual
关键字 - 这正是它所做的。
您必须在Base
的初始值设定项列表中明确初始化Z
,以消除X
中的初始化和Y
中的初始化之间的歧义。
答案 1 :(得分:3)
见this question。要点是,在使用虚拟继承时,必须显式调用基类构造函数。
答案 2 :(得分:0)
最派生的构造函数中的初始化列表用于初始化基类。由于类Z继承自继承自公共基类的类X和Y,因此virtual关键字仅用于为基类创建单个子对象,以便在访问数据成员时消除歧义。