gpt4 book ai didi

c++ - 如何将子类分配给基类?

转载 作者:太空狗 更新时间:2023-10-29 23:29:09 26 4
gpt4 key购买 nike

我知道有与此问题相关的已解决问题,但我仍然无法弄清楚如何解决我的问题。

我有这样的东西:

class Base
{
static Base* createBase()
{
Base *b = new Base();
... //does a lot of weird things
return b;
}
}

class Child : public Base
{
static Child* createChild()
{
Child *c = createBase(); // error
return c;
}
}

我知道为什么它不起作用,但我必须找到一种方法来做到这一点。 createBase 函数做了很多事情,所以我不想重新编码。

有什么建议吗?

最佳答案

为什么您认为它会起作用?你不能把一个 Base 对象当作一个 Child 对象,因为 Child 类可能有各种附加数据 Base 没有。

为了得到你想要的效果,有两种方法可以做到:

第一种方法,可能也是最好的想法,是将逻辑从 createBase 移到 Base 构造函数中。无论您是创建一个 Base 还是从它派生的东西,Base 构造函数都会运行。看起来您正在尝试执行初始化基础对象的工作,而这正是构造函数的用途!

如果出于某种原因这在您的情况下不起作用,另一种选择是在 Base 中创建一个 protected initialize 方法,它接受一个 Base* 并执行您当前在 createBase 中执行的所有工作,例如

class Base
{
public:

static Base* createBase()
{
Base* b = new Base();
initialize(b);
return b;
}

protected:

static void initialize(Base* b)
{
... //does a lot of weird things
}
}

class Child : public Base
{
public:
static Child* createChild()
{
Child *c = new Child();
initialize(c):
return c;
}
}

请注意,这是有效的,因为虽然您不能将 Base* 视为 Child*,但您可以换句话说,把一个 Child* 当作一个 Base*,因为 Child 类保证至少拥有Base 类,由于继承的性质。

编辑:我看到您在另一个答案的评论中发帖说您不能修改Base 的定义。在那种情况下,你就完全倒霉了,考虑到游戏中的限制,你将不得不接受复制和粘贴的需要。如果您不能修改其代码,您将无法调用 createBase 并取回指向除 Base 之外的任何类型的对象的指针。

关于c++ - 如何将子类分配给基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3762224/

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