使用指向基本抽象类的指针访问子类成员,该抽象类不能是dynamic_cast

时间:2014-10-07 21:18:57

标签: c++ pointers dictionary inheritance dynamic-cast

我有一个玩家类,有:

typedef string cptype;
map <cptype, unique_ptr<Cp> > Cps;

我添加了一个指向此地图的指针:

Cps.insert(make_pair("Pos", unique_ptr<Cp>(new PosCp())));

现在当我尝试使用以下方法访问PosCp的pos成员变量时:

Cps["Pos"]->pos = sf::Vector2f(0, 0);

我收到错误:

class Cp has no member pos

当我尝试使用dynamic_cast时,使用以下内容:

dynamic_cast<PosCp*>(Cps["Pos"])->pos = sf::Vector2f(0, 0);

我收到错误:

cannot dynamic_cast [this object]

(理所当然,我不想改变指针,我只是想访问成员变量)

如何在不更改地图中指针类型的情况下访问成员pos

以下是CpPosCp类:

class Cp
{
    public:
        Cp();
        virtual ~Cp();

        cptype type;
};

class PosCp : public Cp
{
    public:
        PosCp();
        ~PosCp();

        sf::Vector2f pos;
};

1 个答案:

答案 0 :(得分:3)

你可以试试这个:

if (PosCp * p = dynamic_cast<PosCp *>(Cps["Pos"].get()))
{
    p->pos = sf::Vector2f(0, 0);
}
else
{
    // most-derived type of *Cps["Pos"] is not PosCp
}