Mam taką hierarchię klas:
class A
{
char a;
public:
A(char _a)
{
a = _a;
}
};
class B : public A
{
char b;
public:
B(char _a, char _b) : A(_a)
{
b = _b;
}
};
class C : public B
{
char c;
public:
C(char _a, char _b, char _c) : B(_a, _b)
{
c = _c;
}
};
B dziedziczy po A, C dziedziczy po B. Wszystko jest w porządku. Problem pojawia się, gdy B dziedziczy po A wirtualnie:
class A
{
char a;
public:
A(char _a)
{
a = _a;
}
};
class B : virtual public A
{
char b;
public:
B(char _a, char _b) : A(_a)
{
b = _b;
}
};
class C : public B
{
char c;
public:
C(char _a, char _b, char _c) : B(_a, _b)
{
c = _c;
}
};
Wówczas kompilator zgłasza błąd, że w klasie A nie ma bezparametrowego konstruktora. O co chodzi? Zauważyłem, że jeśli klasę zmodyfikuję w taki sposób:
class C : public B
{
char c;
public:
C(char _a, char _b, char _c) : A(_a), B(_a, _b)
{
c = _c;
}
};
To program się kompiluje. Ale chyba nie tak to się rozwiązuje, prawda? Struktura mojego programu jest znacznie bardziej złożona, więc gdybym zawsze wywoływał konkretne konstruktory wszystkich klas bazowych, po kod stałby się "trochę" bardziej zagmatwany.
Jak to rozwiązać?