用父类实例化的Downcast对象

时间:2018-06-13 07:44:45

标签: c++ casting dynamic-cast reinterpret-cast

我有一个父子继承结构。我有一个父类实例化(新)的对象。我想把这个对象转发给子类。 我需要一个像转换一样的自动例程,因为父类有很多属性,并且在子对象中复制父属性是不可能的。

我可以使用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时的转换。 感谢您的帮助。

1 个答案:

答案 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()