首页 > 解决方案 > 在讨论向量内的对象时,如何访问特定于派生类的方法和属性?

问题描述

我正在构建一个简单的国际象棋应用程序,我一直在发现一些问题。这是我的问题:

我有一个课件:

class Piece {
protected:
    std::string name; // this is to store the piece's name (bishop, rook, etc.)
public:
    Piece();
    int positionX;
    int positionY;
    std::string getName();
};

我还有一个类 Board,它有一个 8x8 的 Pieces 矩阵:

class Board {
public:
    // the construct fills the matrix with instances from Piece just so all matrix slots will have a piece
    Board();
    void showBoard();
    std::vector<std::vector<Piece>> piece;
    void place(Piece piece, char positionY, int positionX);
};

目前,我有一个包含 64 个通用棋子的棋盘对象。

现在,我创建了一个类 Rook,它继承自 Piece:

class Rook: public Piece {
private:
    std::string color;
public:
    Rook(std::string color);
    std::string getColor();
    bool isRook = true; // dummy attribute just to show you my problem
};

现在我尝试将我的车放在我的碎片矩阵中:

Board board;
Rook rook = Rook("white");
rook.positionX = 3;
rook.positionY = 0;
board.piece.at(rook.positionX).at(rook.positionY) = rook;

std::cout << board.piece.at(3).at(0).positionX << std::endl; // as expected, this outputs 3

最后,这是我的实际问题:

当我尝试访问只有 rook 拥有的东西,而不是其他部分时,例如 bool isRook,它会抛出一个错误,即 Piece 类没有属性 isRook:

std::cout << board.piece.at(3).at(0).isRook << std::endl; // this throws an error "class Piece has no attribute isRook"

我认为这是因为我有一个 Pieces 矩阵,所以我无法访问 Rooks 特有的东西。我该如何解决这个问题?

标签: c++

解决方案


问题是:要么使用多态性,要么不使用。介于两者之间的事情是可能的,但会增加复杂性。拥有一个基类指针容器并希望将对象作为子类访问是一种设计味道。您可以通过在基类中提供方法来修复它:

class Piece {
protected:
    std::string name; // this is to store the piece's name (bishop, rook, etc.)
public:
    Piece();
    int positionX;
    int positionY;
    std::string getName();
    bool isRook();                   // all Pieces have a isRook()
    virtual ~Piece();                // virtual destructor !
};

另请注意,Piece缺少虚拟析构函数。最后但并非最不重要的一点是,您需要一个指针向量来利用多态性。目前你有对象切片。在这里阅读更多内容:为什么没有指针/引用就不能工作多态性?


推荐阅读