C++ c++;-具有派生类的自动转换

C++ c++;-具有派生类的自动转换,c++,class,oop,C++,Class,Oop,我有一个名为Action的类,还有一个从Action派生的MoveAction,还有一个包含变量的对象:Action-Action\u-to\u-perform。现在我为这个变量指定了一个新的MoveAction。这些动作类包含一个方法perform()移动动作执行的不是动作。当我打电话时 object->action_to_perform 然后,当设置为MoveAction对象时,它调用Action的perform方法。我如何自动将其转换为移动动作 编辑: 行动.h: class Ac

我有一个名为
Action
的类,还有一个从
Action
派生的
MoveAction
,还有一个包含变量的对象:
Action-Action\u-to\u-perform
。现在我为这个变量指定了一个新的MoveAction。这些动作类包含一个方法
perform()
<代码>移动动作执行的不是动作。当我打电话时

object->action_to_perform
然后,当设置为MoveAction对象时,它调用Action的perform方法。我如何自动将其转换为移动动作

编辑:

行动.h:

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

    virtual void perform();
protected:
private:
};
行动h:

class MoveAction : public Action
{
public:
    MoveAction(int, int);
    virtual ~MoveAction();

    int dx, dy;

    virtual void perform();
protected:
private:
};
在Player.cpp中:

Action action_to_perform;
...
action_to_perform = MoveAction(0, 1);

您正在经历的问题

您需要存储指向
操作
的指针

Action* action_to_perform = NULL;
...
action_to_perform = new MoveAction(0, 1);
action_to_perform->perform();
应该有用

为了简化内存管理,最好存储智能指针,例如
shared\u ptr
unique\u ptr

std::unique_ptr<Action> action_to_perform;
...
action_to_perform.reset(new MoveAction(0, 1));
action_to_perform->perform();
std::要执行的唯一ptr操作;
...
动作_至_执行.重置(新移动动作(0,1));
动作到执行->执行();

您是否已将函数声明为虚拟函数?显示一些代码是的,执行声明为虚拟。我添加了一些代码,显示了我的意思。如果你想保留虚拟行为,可以使用指向动作的指针。你所做的是真正的切分,你的
action\u to\u perform=MoveAction(0,1)
实际上是使用
action::operator=(const action&)
切分对象-VMT of action,而不是MoveAction)来帮助避免这样做,使行动纯粹虚拟化。将执行声明为
virtualvoid perform()=0副本。由于一些奇怪的原因重新打开。引用也可以工作,尽管在OPs特定的用例中不起作用。我还建议使用某种类型的智能指针(
shared\u ptr
unique\u ptr
,等等)