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函数做了很多事情,所以我不想重新编码它.
有什么建议?
你为什么期望这个工作?您不能将Base
对象视为Child
对象,因为Child
该类可能具有Base
不具有的各种其他数据.
为了获得您正在寻找的效果,有两种方法可以做到:
第一种方式,也许是最好的想法,是将逻辑从构造函数移动createBase
到Base
构造函数中.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
无法修改代码之外,您无法调用并获取指向任何类型对象的指针.
归档时间: |
|
查看次数: |
2157 次 |
最近记录: |