C ++如何使用派生对象中的独立基础对象

Posted

技术标签:

【中文标题】C ++如何使用派生对象中的独立基础对象【英文标题】:C++ How to use stand-alone base object from derived object 【发布时间】:2014-11-04 11:23:41 【问题描述】:

我有 3 节课。一个是基地,一个是父母,一个是孩子。父级在某个时刻被实例化并分配数据。在某些情况下,它被直接使用,但在其他情况下,需要在其子类中实现功能。

我想做的是将父对象转换为子对象,以便将其虚函数与父对象的数据一起使用:

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 数据),尽管我发誓它应该是未定义的行为(我知道这也可以有效)。由于我怀疑这是正确的做法,所以我想问一下这是否可以,或者除了合成之外是否还有其他方法。

【问题讨论】:

如果您将对象创建为父对象,则它永远不会成为/转换为子对象。您必须将其实例化为孩子,将其视为父母,有时将其视为孩子。 ommandParent *parent = new CommandParent;,在此行之后对CommandChild 的任何考虑根本都是错误的。不存在这样的物体,而且你不会通过挥动魔杖来神奇地创造一个。 是的,我明白了。有什么方法可以将基础对象“注入”到子对象中作为其基础? @Resurrection 没有标准的 AFAIK。你最好改变你的设计中的一些东西 什么? “基础对象”UndoBase 已经在CommandChild 的继承层次结构中。您要解决的真正问题是什么?直接从CommandChild 对象指针/引用调用某个成员,例如:CommandParent::redo(),而不是咬入虚拟覆盖苹果? 【参考方案1】:
UndoBase *command = static_cast<CommandChild*>(parent);

这条线的每一寸都是地狱。您告诉 static_cast 转换为 CommandChild 而您将其存储在 UndoBase 中。

您还尝试将 CommandParent 转换为 CommandChild 意味着 Base 到 Derived,其中 Base 类不知道派生转换。即使你写得好。

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

这将是错误的。除此之外,在这些情况下始终使用 dynamic_cast。它显式检查是否可以进行强制转换。如果强制转换安全,dynamic_cast 将正确强制转换,如果无法强制转换为目标类型,则返回 NULL(在指针的情况下,对于引用,它会抛出 bad_cast 异常)。

【讨论】:

【参考方案2】:

您必须使用复制构造函数使用来自 CommandParent 的数据创建一个新的 CommandChild 实例。

UndoBase *command = new CommandChild(*parent);

【讨论】:

以上是关于C ++如何使用派生对象中的独立基础对象的主要内容,如果未能解决你的问题,请参考以下文章

C++如何使用派生类构造函数销毁基类中的对象

使用C语言为python编写动态模块--解析python中的对象如何在C语言中传递并返回

如何访问字典数组并使用Objective C中的字典对象?

如何使用 Objective C 查询 Realm DB 中的嵌套对象

如何在Objective C中使用解析版本1.12.0加载PFQueryTableViewController中的对象?

C#基础:GC机制中如何判断一个对象是否扔在被使用