C++如何在Queen子类中调用Rook、Bishop类函数避免代码冗余
解决方案
有两种主流方案可以实现需求,不需要重写Queen的移动逻辑,优先推荐第一种组合复用方案,不需要修改现有Rook、Bishop的定义,实现成本更低。
方案1:组合复用(优先推荐)
Queen保持原有直接继承Piece的结构,在实现自身的canMoveTo和squaresInBetween方法时,构造临时的Rook、Bishop对象复用其逻辑即可,示例实现如下:
#include "Queen.h" #include "Rook.h" #include "Bishop.h" Queen::Queen(string currentPos) : Piece(currentPos) {} bool Queen::canMoveTo(string square) { // 构造与Queen当前位置一致的临时Rook、Bishop对象 Rook tempRook(currentPosition); Bishop tempBishop(currentPosition); // 符合任意一种移动规则即可 return tempRook.canMoveTo(square) || tempBishop.canMoveTo(square); } vector<string> Queen::squaresInBetween(string square) { Rook tempRook(currentPosition); if (tempRook.canMoveTo(square)) { return tempRook.squaresInBetween(square); } Bishop tempBishop(currentPosition); return tempBishop.squaresInBetween(square); }
该方案规避了多继承的坑,不需要调整原有Rook、Bishop的继承结构,完全符合作业需求。
方案2:虚继承解决菱形继承问题
如果一定要用多继承实现,可以通过虚继承让Rook、Bishop共享同一份Piece基类实例,解决两份副本的问题,修改步骤如下:
- 修改Rook、Bishop的继承声明为虚继承:
// Rook.h修改继承部分 class Rook : virtual public Piece { // 其余内容保持不变 }; // Bishop.h修改继承部分 class Bishop : virtual public Piece { // 其余内容保持不变 };
- 修改Queen的继承结构,同时继承Rook和Bishop,实现对应方法:
// Queen.h修改 #ifndef QUEEN_H #define QUEEN_H #include "Rook.h" #include "Bishop.h" class Queen : public Rook, public Bishop { public: Queen(string currentPos); virtual bool canMoveTo(string square); virtual vector<string> squaresInBetween(string square); }; #endif
// Queen.cpp实现 Queen::Queen(string currentPos) : Piece(currentPos), Rook(currentPos), Bishop(currentPos) {} bool Queen::canMoveTo(string square) { return Rook::canMoveTo(square) || Bishop::canMoveTo(square); } vector<string> Queen::squaresInBetween(string square) { if (Rook::canMoveTo(square)) { return Rook::squaresInBetween(square); } return Bishop::squaresInBetween(square); }
注意虚继承要求最派生类(Queen)负责初始化虚基类(Piece),所以Queen的构造函数需要显式调用Piece的构造函数。
内容的提问来源于stack exchange,提问作者The Surgeon of Death
相关产品推荐
相关产品推荐

