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的角度考虑,是否有任何难题的解决方案?
答案 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.