Виртуальное наследование и виртуальные функции - разные понятия.
Виртуальное наследование является особенным в том смысле, что виртуальные базы должны быть явно инициализированы всеми производными классами.В этом случае Derived2
пытается делегировать инициализацию Base
в Derived1
, но это недопустимо.Что на самом деле делает конструктор Derived2
, так это вызывает конструктор по умолчанию Base
из-за пропуска mem-initializer , который инициализирует Base
.
. Вы должны вызватьконструктор Base
в явном виде:
class Derived2 :public Derived1 {
public:
Derived2(int &id) : Base(id), Derived1(id)
{
};
};
Конечно, если Derived1
не должен был быть фактически производным от Base
, то производные классы Derived1
могут просто полагаться на Derived1
'Конструктор s для инициализации Base
.Таким образом, другое исправление, в зависимости от вашей ситуации, состоит в том, чтобы просто удалить virtual
в base-спецификаторе :
class Derived1 :public Base {
public:
Derived1(int &id) :Base(id)
{
};
};
class Derived2: public Derived1 {
public:
Derived2(int &id) :Derived1(id)
{
};
};