Возникли проблемы с множественным наследованием. Я решил проблему с алмазами:
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) {}
};
В виртуальном наследовании конструктор виртуальной базы вызывается из конструктора большинства производных классов:
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