C ++ - есть ли способ наследовать одни функции только один раз, а другие несколько раз при множественном наследовании? - PullRequest
3 голосов
/ 26 апреля 2019

Моя проблема заключается в следующем:

Я создаю игру в шахматы на C ++, и существует базовый класс Figure, который содержит функциональность, общую для всех фигур, с виртуальной функцией checkMove, которая переопределяется индивидуально для каждой фигуры (как, естественно, для каждой фигуры). движется по разным правилам). Шахматная доска - это двумерный массив указателей на Figure с (пустые квадраты - просто нулевые указатели).

Дело в том, что я хотел бы, чтобы Queen наследовал Rook и Bishop, так как он представляет собой смесь как для всех намерений, так и для целей, вместо того, чтобы писать свою собственную ненужную длинную переопределение checkMove .

И тут возникает моя проблема: в базовом классе Figure есть фундаментальные функции определения, каким персонажем будет представлена ​​фигура в консоли, какой команде она принадлежит и т. Д. Я бы хотел, чтобы королева наследовать только один экземпляр этих функций.

Однако я бы хотел, чтобы королева унаследовала функцию checkMove дважды - один раз от Rook и один раз от Bishop, чтобы просто вызывать оба в своей собственной checkMove версии ..

Я попробовал некоторые решения, также поиграл с Rook и Bishop, унаследовавшими класс Figure виртуально, но я не могу собрать все воедино. Я новичок в концепции полиморфизма, поэтому не могу найти правильную логику для реализации этой функциональности. Что было бы хорошим подходом?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Королева не ладья.

Я бы держался здесь (далеко) от наследства - единственное повторное использование действительно только для королевы.

Лучшим дизайном здесь будет что-то вроде следующего ( псевдокод ):

struct Queen {
  ValidMoves canMove(GameState state) {
    ValidMoves res;
    res.insert( canMoveAsRook(state) );
    res.insert( canMoveAsBishop(state) );
    return res;
  }
};
1 голос
/ 26 апреля 2019

Да, есть.

Но это не очевидно. Вы не наследуете Queen от Rook и Bishop. Вместо этого вы вводите определенный Move базовый класс. Теперь QueenMove может наследовать от RookMove и BishopMove. Элемент Queen просто является типом Piece, конструктор которого устанавливает Piece::move (a unique_ptr<Move>) в QueenMove.

...