使用派生类自动强制转换

automatic casting with derived class

本文关键字:转换 派生      更新时间:2023-10-16

我有一个叫做Action的类,和一个来自ActionMoveAction,我有一个包含变量的对象:Action action_to_perform。现在我给这个变量分配了一个新的MoveAction。这些Action类包含一个方法perform()MoveAction所做的事情与Action所做的有所不同。当我调用

object->action_to_perform

被设置为MoveAction对象时,它调用Action的perform方法。我如何自动将它转换为MoveAction?

编辑:

Action.h:

class Action
{
public:
    Action();
    virtual ~Action();
    virtual void perform();
protected:
private:
};

MoveAction.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* action_to_perform = NULL;
...
action_to_perform = new MoveAction(0, 1);
action_to_perform->perform();

为了简化内存管理,最好存储一个智能指针,如shared_ptrunique_ptr

std::unique_ptr<Action> action_to_perform;
...
action_to_perform.reset(new MoveAction(0, 1));
action_to_perform->perform();