调用继承的向量元素的成员函数

时间:2016-03-20 09:36:21

标签: c++ polymorphism

我正在研究一种2D世界块中的玩家的模拟。许多块对象存储在向量中,并且每个块对象都有一个成员,该成员是对该向量的引用,因此每个对象可以遍历其他对象以处理诸如冲突之类的事情。为了简化玩家对物理的物理,我让Player类继承了Block类。虽然这确实使物理变得更加简单,但我遇到了在从向量引用播放器时无法调用播放器成员函数的问题。

以下是这些类的一些简化版本:

class Block{
private:
    std::vector<Block>& blocks;
public:
    Block(std::vector<Block>& b) : blocks(b) {}
};

class Player : public virtual Block{
public:
    Player(std::vector<Block>& b) : Block(b) {}
    void player_only_function();
};

std::vector<Block> blocks;
Player player(blocks);
blocks.push_back(player);

blocks[0].player_only_function(); // This line in incorrect

有一种简单的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果您只有Block个对象的向量,那么当玩具推回您的Player对象时,您就会对象切片,这是不可能的。< / p>

相反,你必须使用指针和名为 downcasting 的东西。像

std::vector<Block*> blocks;
blocks.push_back(new Player(blocks));

static_cast<Player*>(blocks[0])->player_only_function();

但是,您必须要小心,您所做的转发实际上是有效的,并且blocks[0]是指向Player对象的指针。