Downcast объект, который был создан с родительским классом - PullRequest
0 голосов
/ 13 июня 2018

У меня есть структура наследования родитель-ребенок.У меня есть объект, который был создан (новый) родительским классом.Я хочу перевести этот объект в дочерний класс.Мне нужна автоматическая процедура, такая как приведение, потому что родительский класс имеет много свойств, и копирование родительских свойств в дочернем объекте невозможно.

Я могу привести родительский объект к дочернему объекту с помощью оператора 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, но большинство из них описывают приведение, когда объект новый с дочерним классом.Ваша помощь приветствуется.

1 Ответ

0 голосов
/ 13 июня 2018

вы не должны использовать 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()

...