多重继承有问题。我解决了钻石问题:
class A
{
int m;
int n;
public:
A(int x, int y)
{
m = x; n = y
}
fA() {}
};
class B : virtual public A // B has fA(),fB()
{
public:
B(int k) : A(1, k) {}
fB() {}
};
class C : virtual public A // C has fA(),fC()
{
public:
C(int k) : C(2, k) {}
fC() {}
};
class D : public B, public C // D has fA(),fB(),fC()
{
public:
D(int k) : B(k),C(k),A(3,k)
};
这很好用。问题:
class S : public B // S has fA(),fB()
{
public:
S() : B(6) {}
};
Compilator向我展示:“错误:没有匹配函数来调用`A :: A()'”
此代码正常运行,但它并不满足我:
class S : public B // S has fA(),fB()
{
public:
S() : B(6),A(1,6) {}
};
答案 0 :(得分:6)
在虚拟继承中,虚拟基础的构造函数是从大多数派生类的构造函数中调用的:
class S : public B // S has fA(),fB()
{
public:
S() : B(6) {}
}; // ^ A base class is initialized at this point, before B
这也意味着忽略继承链中进一步向初始化列表中的A
构造函数的其他显式调用:
class B : virtual public A // B has fA(),fB()
{
public:
B(int k) : A(1, k) {}
fB() {} // ^^^^^^^ this call is ignored when B is a part of S object
};
如果在大多数派生类的初始化列表中没有显式调用虚拟基础构造函数,编译器将(当然)尝试调用默认构造函数。但是A
没有一个,那就是你的问题。
您自己已经发现的一种解决方案。另一种是为A
编写默认构造函数。