使用具有指向派生类对象的指针的基类指针数组调用派生类方法

Posted

技术标签:

【中文标题】使用具有指向派生类对象的指针的基类指针数组调用派生类方法【英文标题】:Calling derived class methods using array of base class pointers which has pointers to derived class objects 【发布时间】:2016-12-17 14:23:10 【问题描述】:

我有一个基类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;

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

(对于问题的长标题表示歉意。如果可以的话,请建议一个新标题)

【问题讨论】:

我不完全相信你在这里的设置,你没有发布编译错误,我想(假设内存正确分配给allPlayers)你应该能够说类似allPlayers[0] = new Human(); 的话。尽管除非您有信心,否则我会考虑更改设置,以便 allPlayers 是强指针或类似的向量。 【参考方案1】:

我发现您的代码中有几个错误。我已经在下面的代码中纠正了这个错误,

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;

必须在构造初始化列表中初始化引用。也不允许引用临时对象,所以

"Game::Game():h(new Human),c(new Computer)"

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

【讨论】:

以上是关于使用具有指向派生类对象的指针的基类指针数组调用派生类方法的主要内容,如果未能解决你的问题,请参考以下文章

指向派生对象的基类指针的 C++ 排序容器

关于C++基类、派生类的引用和指针

基类指针指向派生类对象&派生类指针指向基类对象

在 C++ 中将派生类对象分配和访问到基类“指向指针”对象

使用具有抽象基类指针并调用派生类函数的映射

基类指针和派生类指针