You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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基类实例,解决两份副本的问题,修改步骤如下:

  1. 修改Rook、Bishop的继承声明为虚继承:
// Rook.h修改继承部分
class Rook : virtual public Piece
{
    // 其余内容保持不变
};

// Bishop.h修改继承部分
class Bishop : virtual public Piece
{
    // 其余内容保持不变
};
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:36:03