gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:36:07 26 4
gpt4 key购买 nike

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

我想做的是将父对象转换为子对象,这样它的虚函数就可以与父对象的数据一起使用:

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

最佳答案

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

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

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

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

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

关于C++ 如何使用派生对象的独立基础对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26733918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com