2014-11-04 75 views
0

我有3个类。一个是基地,一个是父母,一个是小孩。父母在某个时间点实例化并分配数据。在某些情况下,它直接使用,但在其他情况下,需要在其子类中实现功能。C++如何使用派生对象中的独立基础对象

我想什么做的是对父对象浇铸成子对象,因此它的虚函数将与母公司的数据可用于:

class UndoBase : public QUndoCommand 
{ 
public: 
    UndoBase() {}  

    virtual void undo() = 0; 
    virtual void redo() = 0; 
}; 

class CommandParent : public UndoBase 
{ 
public: 
    CommandParent() {} 

    virtual void undo() 
    virtual void redo() 

protected: 
    someType data 
}; 

class CommandChild : public CommandParent 
{ 
public: 
    CommandChild() {} 

    virtual void undo() //overrides parent 
    virtual void redo() //overrides parent 
}; 

我已经试过这样:

CommandParent *parent = new CommandParent; 
//assign data 
UndoBase *command = static_cast<CommandChild*>(parent); 
command->redo(); 

而且它工作(使用CommandChild实现和CommandParent数据),虽然我会发誓它应该是未定义的行为(这也可以工作,我知道)。既然我怀疑这是正确的做法,我想问问这是否确定,或者除了组合之外还有其他方法。

+0

如果您将对象创建为父对象,则永远不会成为/转换为子对象。你必须立即将它作为一个孩子,把它当作父母来对待,有时把它当作一个孩子来对待。 – 2014-11-04 11:26:30

+1

'ommandParent * parent = new CommandParent;',此行错误后''CommandChild'的任何考虑* *。没有这样的物体存在,你不会通过挥动魔杖来神奇地创造出这样的物体。 – WhozCraig 2014-11-04 11:32:20

+0

是的,我明白了。任何将基础对象“注入”孩子作为基础的方法? – Resurrection 2014-11-04 11:37:33

回答

-1

您必须使用复制构造函数从CommandParent创建CommandChild的新实例。

UndoBase *command = new CommandChild(*parent); 
1
UndoBase *command = static_cast<CommandChild*>(parent); 

这是所有的地狱,在这条线的每寸。您正在告诉static_cast投射到CommandChild,而您将其存储在UndoBase中。

此外,您正试图将CommandParent转换为CommandChild,意味着要派生Base,其中Base类不知道派生转换。即使你写得很好。

CommandChild *child = static_cast<CommandChild*>(parent); 

这将是错误的。除此之外总是使用dynamic_cast这些情况。它会明确检查cast是否可能。如果cast是安全的,那么.dynamic_cast将正确转换;如果不能转换为目标类型,则返回NULL(如果是指针,则为引用抛出bad_cast异常)。

相关问题