c++ - 如何用父类实例化抽象子类

标签 c++

我正在尝试制作国际象棋游戏,但在创建对象时遇到困难。我的思考过程是这样的:

创建一个包含 64 个图 block 的游戏板,这些图 block 将有自己的位置和指向棋子的指针,因此我可以“轻松”加载和卸载棋子。

图 block 类:

class Tile {
private:
    int x;
    int y;
    Piece* piece;
public:
    Tile(int x, int y) {
        this->x = x;
        this->y = y;
        piece = nullptr;
    }
    void loadTile(Piece piece) {
        this->piece = new Piece(piece); //this gives an error
    }
    void unloadTile() {
        delete this->piece;
    }
};

各个部分将从父类继承(下面您可以看到一个简化版本)。继承的棋子都将具有相同的构造函数,并且它们仅在计算可能的移动的方式上有所不同。在我看来,这是使用虚拟函数的最佳场景。

棋子和典当类:

class Piece {
protected:
    int x;
    int y;
public:
    Piece(int x, int y) {
        this->x = x;
        this->y = y;
    }
    virtual vector<int> returnPossibleMoves() = 0;
};

class Pawn : public Piece {
public:
    using Piece::Piece;
    vector<int> returnPossibleMoves() {
        vector<int> moves;
        moves.push_back(10); //dont think about this too much
        return moves;
    }
};

问题是 - loadTile() 函数无法实例化piece对象,因为它是抽象的。

我可以看到我的代码可能无法工作,因为我尝试使用 Pawn 实例化 Piece,但我真的不知道如何让它工作,或者这个问题的解决方法是什么。希望您能够明白我想要做什么。

最佳答案

严格回答这个问题:你不能创建抽象类的实例。这就是为什么不允许 new Piece 的原因。您必须创建一个非抽象的派生类型的实例,例如 Pawn,并将 block 指针指定为指向该实例:

void Tile::loadTile() {
    this->piece = new Pawn; //this is allowed
}

考虑到这一点,您显然需要进行一些设计更改,其中一些已在您的问题的评论中提到。

关于c++ - 如何用父类实例化抽象子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65927262/

相关文章:

c++ - 可以从播放中更改 AlternateViewPointCap 或 MirrorCap

C++ 构造函数与初始化列表速度比较

C++ 重载或监视解引用运算符(在指针上)

c++ - 在 C/C++ 中读取两个键值

c++ - 使用一些库分发程序(源文件)

c++ - 想知道低版本的Visual Studio是否可以使用使用高版本的Visual Studio构建的dll?

c++ - 如何为函数模板编写显式特化代码(字符串的冒泡排序数组)

c++ - 关于 C++ 中全局内联函数的示例

c++ - 生成 C 和 CPP 文件的 Makefile

c++ - 添加typename导致程序编译失败