Помните, что при создании объекта Queen
этот объект включает в себя объект Rook
и объект Bishop
.Оба этих объекта также должны быть созданы при создании объекта Queen
.
Поскольку ваш код в данный момент написан, компилятор попытается вызвать конструкторы по умолчанию Bishop()
и Rook()
для создания экземпляров этих объектов.objects.
Но ваш код не определяет конструкторы Bishop()
и Rook()
- поэтому вы получаете сообщение об ошибке, сообщающее, что классы Bishop
и Rook
не имеют определенных конструкторов по умолчанию.
Один из способов решения вашей проблемы - определить конструкторы по умолчанию Bishop()
и Rook()
вместе с конструктором по умолчанию Piece()
...
protected:
Piece::Piece() { }
Bishop::Bishop() { }
Rook::Rook() { }
… если вы это сделаете,вам нужно сделать эти конструкторы protected
, чтобы их можно было вызывать только из производных классов.
Другой подход заключается в изменении конструктора Queen
для явного вызова конструкторов Bishop
и Rook
.что вы уже определили ...
Queen::Queen(Colour c, const Position& pos)
: Bishop(c, pos), Rook(c, pos), Piece(c, pos)
Если ваши конструкторы Bishop(c, pos)
и Rook(c, pos)
выполняют реальную работу, тогда этот второй подход является единственным реальным решением (при условии, что tРеальная работа зависит от переданных им параметров Color и Position).