如何将子类分配给基类?

sar*_*ara 2 c++ inheritance class variable-assignment

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

我有这样的事情:

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;          
   }
}
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

Tyl*_*nry 9

你为什么期望这个工作?您不能将Base对象视为Child对象,因为Child该类可能具有Base不具有的各种其他数据.

为了获得您正在寻找的效果,有两种方法可以做到:

第一种方式,也许是最好的想法,是将逻辑从构造函数移动createBaseBase构造函数中.Base无论您是创建一个Base或从它派生的东西,构造函数都将运行.看起来你正在尝试初始化基础对象,而这正是构造函数的用途!

如果出于某种原因,这在您的情况下不起作用,另一个选择是创建一个受保护的initialize方法,Base其中接受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;          
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是有效的,因为虽然你不能把它Base*当作a Child*,但你可以走另一条路并把它Child*看作是a Base*,因为Child该类保证至少具有Base该类所做的所有事情,到期对于继承的本质.

编辑:我看到你在评论中发布了另一个你不能修改定义的答案Base.在这种情况下,你完全没有运气,鉴于游戏中的限制,你必须接受复制和粘贴的需要.createBase除了Base无法修改代码之外,您无法调用并获取指向任何类型对象的指针.