我有一个父子继承结构。我有一个父类实例化(新)的对象。我想把这个对象转发给子类。 我需要一个像转换一样的自动例程,因为父类有很多属性,并且在子对象中复制父属性是不可能的。
我可以使用reinterpret_cast运算符将父对象强制转换为子对象,这样我的子对象中就有父属性值,但我遇到了其他问题。
如果您将内存分配给其中一个子特定变量,则在向下转换后,当您要删除子对象时,您将面临内存分段错误错误。堆似乎已经损坏了。
我的代码与此类似:
class parentclass
{
public:
int parent_var = 10;
parentclass()
{
parent_var = 20;
}
};
class childclass :parentclass
{
public:
int* child_var;
childclass()
{
child_var = NULL;
}
};
void main()
{
parentclass* pobj = new parentclass();
childclass* cobj;
cobj = reinterpret_cast<childclass*>(pobj);
//everything is ok, cobj.parent_var has correct value (=20)
//and child specific variables are filled with random variables.
delete cobj;
// cobj delete successfully
parentclass* pobj2 = new parentclass();
childclass* cobj2;
cobj2 = reinterpret_cast<childclass*>(pobj2);
//everything is ok and
//cobj2.parent_var has correct value
cobj2->child_var = new int[10]; // assign memory to child specific variable
delete cobj2; // Here Heap corruption Error occurred.
}
我在stackoverflow中读取了类似的页面,但是大多数都描述了在具有子类的对象new时的转换。 感谢您的帮助。
答案 0 :(得分:0)
在这种情况下你不应该使用reinterpret_cast(并且通常会尝试避免它)因为reinterpret_cast只是改变了它不执行任何其他操作的数据的解释然后更改类型
这意味着cobj仍然指向与pobj相同的数据。这就是您尝试修改child_var
如果指针是作为孩子创建的,你只能向下转发,我的意思是
parentclass* pobj = dynamic_cast<parentclass*>(new childclass()); //created as a child not a parent
childclass* cobj;
cobj = dynamic_cast<childclass*>(pobj); //dynamic_cast instead of reinterpret_cast
如果parrent是公开的话,会起作用
class childclass : public parentclass
也
void main()
应为int main()