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
,等等)