我有一个基类Player和两个派生类HumanComputerPlayer是一个抽象类,它具有纯虚拟方法PlayMove

现在,在Game类中,我希望有一个所有在游戏中玩的玩家的数组。很少有玩家会使用Human类型,其他人不会使用Computer。我想以这样的方式实现它-对于数组中的每个播放器,我将调用PlayMove,并根据播放器的类型,调用其自己的PlayMove

例如说array = {humanPlayer, computerPlayer}array[0].PlayMove()应该落在Human::PlayMove()array[1].PlayMove()应该落在Computer::PlayMove()

-

我做了什么 -

class Game
{
    Human &h;
    Computer &c;
    Player **allPlayers;
}

Game::Game()
{
    h = new Human();
    c = new Computer();
    // problem is occuriung in following three line
    allPlayers = new (Player*)[2];
    allPlayers[0] = h;
    allPlayers[1] = c;
}

我知道
Base *b;
Derived d;
b = &d;

这可行。除了需要指针数组之外,这种情况有什么不同?

(为问题的长标题表示歉意。如果可以的话,请提出一个新标题)

最佳答案

我在您的代码中看到了几个错误。我已在以下代码中更正了此错误,

class Player
{};
class Human : public Player
{};
class Computer : public Player
{};

class Game
{
public:
    Game();
    Human *h;
    Computer *c;
    Player **allPlayers;
};

Game::Game()
{
    h = new Human();
    c = new Computer();
    // Following three lines are just fine
    allPlayers = new Player*[2];
    allPlayers[0] = h;
    allPlayers[1] = c;
}

引用必须在施工初始化 list 中初始化。另外,不允许引用临时对象,因此
"Game::Game():h(new Human),c(new Computer)"

不允许。解决方案是使用指针h和c代替引用。

关于c++ - 使用具有指向派生类对象的指针的基类指针数组调用派生类方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41199546/

10-12 19:54