我有一个基类Player
和两个派生类Human
,Computer
。Player
是一个抽象类,它具有纯虚拟方法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/