C++ 使用指向基本Abstract类的指针访问子类成员,该类可以';不要动不动

C++ 使用指向基本Abstract类的指针访问子类成员,该类可以';不要动不动,c++,pointers,dictionary,inheritance,dynamic-cast,C++,Pointers,Dictionary,Inheritance,Dynamic Cast,我有一个玩家类,包括: typedef string cptype; map <cptype, unique_ptr<Cp> > Cps; 我得到一个错误: class Cp has no member pos cannot dynamic_cast [this object] 当我尝试使用dynamic\u cast时,请执行以下操作: dynamic_cast<PosCp*>(Cps["Pos"])->pos = sf::Vector2f(0,

我有一个玩家类,包括:

typedef string cptype;
map <cptype, unique_ptr<Cp> > Cps;
我得到一个错误:

class Cp has no member pos
cannot dynamic_cast [this object]
当我尝试使用
dynamic\u cast
时,请执行以下操作:

dynamic_cast<PosCp*>(Cps["Pos"])->pos = sf::Vector2f(0, 0);
(正确地说,我不想更改指针,我只想访问成员变量)

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

以下是
Cp
PosCp
类:

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

        cptype type;
};

你可以试试这个:

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
}
if(PosCp*p=dynamic_cast(Cps[“Pos”].get())
{
p->pos=sf::Vector2f(0,0);
}
其他的
{
//*CP[“Pos”]的大多数派生类型不是PosCp
}

更重要的是,if在这里的重要性是什么?如果谓词失败会发生什么?在if语句中抖动赋值:(@Yaxlat)那么它不会指向PosCp。发生什么取决于您。@paulm:这里没有赋值。“if(PosCp*p=”您能解释一下这怎么不是赋值吗?
class Cp
{
    public:
        Cp();
        virtual ~Cp();

        cptype type;
};
class PosCp : public Cp
{
    public:
        PosCp();
        ~PosCp();

        sf::Vector2f pos;
};
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
}