Поскольку нет явной инициализации для B
части C
в C::C()
, компилятор использует конструктор по умолчанию B
, чтобы сделать это.
C()
: A(1) {
cout << "C class" << endl;
}
эквивалентно:
C()
: B(), A(1) {
cout << "C class" << endl;
}
по умолчанию конструктор B
пытается инициализировать A
часть с помощью конструктора по умолчанию A
, который не существует. Это сообщение об ошибке компилятора.
Вы можете исправить это одним из следующих способов:
- Обеспечить конструктор по умолчанию для
A
.
- Предоставить конструктор по умолчанию для
B
, в котором используется значение A(int)
для инициализации части B
.
Update
Почему компилятор хочет хотеть A::A()
в B::B()
? Поскольку он не знает, что во время выполнения будет создан экземпляр C
.
Рассмотрим следующий сценарий:
#include <iostream>
using namespace std;
class A
{
public:
A(int)
{
cout << "Came to A(int)" << endl;
}
};
class B : virtual public A
{
public:
virtual void do_something(){};
};
int main()
{
B b;
}
Это понятно, почему B::B()
нужно вызвать A::A(int)
или ожидать A::A()
. Поскольку компилятор не может, apriori, выяснить, является ли B
самым производным классом, он должен убедиться, что есть способ инициализировать A
от B
, если это необходимо.
Благодарим лорда за clang-format. – chris
Прочтите раздел FAQ ISOCPP по этим концепциям http://isocpp.org/wiki/faq/proper-inheritance & http://isocpp.org/wiki/faq/basics-of-inheritance –
[Какой компилятор?] (Http : //coliru.stacked-crooked.com/a/c0d980808c205ea9) – chris