在运行时向上播放。 (从基类变形来派生类)

时间:2010-10-10 15:52:59

标签: php c++ polymorphism casting

class B{
  private:
    int a;
}
class D: public B{
  private:
    int b;
}

B* b = new B;

现在出于某种原因,我希望 b 转换为 D*对象类型。 例如保留 B的信息,成为 D,需要额外的信息。

我目前正在考虑的是。 static_cast进行向上转换。其他属性将设置为null或garbage。然后手动分配其他属性。但这会导致悬挂指针风险。如果没有足够小心地编写复制构造函数。

那么还有什么可以成为正确的解决方案呢? 如果我们从PHP的角度考虑,是否有任何难题的解决方案?

3 个答案:

答案 0 :(得分:0)

如果您执行static_cast<>,则附加属性将为null或垃圾,它们实际上将之外为该对象分配的内存。使用dynamic_cast<>,如果变量不包含正确的类型,则会正确失败。

此外,在这种情况下,C ++和PHP之间的相似之处仅仅是肤浅的;不要用它来进一步“洞察”C ++代码。

答案 1 :(得分:0)

b指向B类型的对象。它不能成为D.如果需要D,则必须分配一个并复制* b中的字段。

除非你用PHP编写内容,否则永远不要从PHP的角度思考问题。永远不要用PHP写任何东西。

答案 2 :(得分:0)

通常无法将基础对象重建为派生对象。首先,分配只为B分配了enought空间,而不为D分配了空间。如果你为D创建了B对象(你目前没有,并且有点难以做到),那么你可以使用黑客来“重建”这样的对象:

// EXTREME HACK, BE CAREFUL, AND USE WITH CARE
// IF YOU DON'T UNDERSTAND IT, DON'T USE IT.
// you should have allocated (sizeof (D)) space to your b pointer.
D* d_object = new (b) D(B(*b));
// you should consider any previous pointer pointing toward the old B* as dangling.