多重继承有问题。我解决了钻石问题:
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) {}
};编译器向我显示:“错误:对`A::a()‘的调用没有匹配函数”
这段代码正在运行,但我并不满意:
class S : public B // S has fA(),fB()
{
public:
S() : B(6),A(1,6) {}
};发布于 2014-12-04 22:23:24
在虚拟继承中,从大多数派生类的构造函数中调用虚拟基的构造函数。
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编写默认构造函数。
https://stackoverflow.com/questions/27305159
复制相似问题