我的问题如下:
我正在用C ++创建一个国际象棋游戏,并且有一个基类Figure
,其中包含所有图形共享的功能,虚拟函数checkMove
为每个图形单独重新定义(当然,每个图形在不同的规则下移动)。国际象棋棋盘是指向Figure
s的二维指针数组(空方块只是空指针)。
问题是,我想让Queen
继承Rook
和Bishop
,因为它是所有意图和目的的混合,而不是写自己不必要的长checkMove
覆盖。
然后是我的问题:在基础Figure
类中,有一些基本功能,用于定义图形将在控制台中表示哪个角色,它属于哪个团队等等。我希望女王只继承一个实例这些功能。
但是,我希望女王继承checkMove
函数两次 - 一次来自Rook
,一次来自Bishop
,以便简单地称之为自己的checkMove
版本。
我尝试了一些解决方案,也玩Rook
和Bishop
虚拟地继承了Figure
类,但是我似乎无法将这些碎片放在一起。我是多态的概念的新手,所以我找不到适当的逻辑来实现该功能。什么是好方法?
女王不是白嘴鸦。
我会在这里引导(远)继承 - 唯一的重用仅限于女王。
这里更好的设计将类似于以下(伪代码):
struct Queen {
ValidMoves canMove(GameState state) {
ValidMoves res;
res.insert( canMoveAsRook(state) );
res.insert( canMoveAsBishop(state) );
return res;
}
};
就在这里。
但这并不是直接显而易见的。你没有从Queen
和Rook
继承Bishop
。相反,你引入了一个特定的Move
基类。现在QueenMove
可以继承RookMove
和BishopMove
。 Queen
片段只是一个Piece
类型,其构造函数将Piece::move
(一个unique_ptr<Move>
)设置为QueenMove
。