Полиморфный массив копирует только базовые атрибуты класса [C ++]

У меня проблема с полиморфными массивами в C ++. Я имею:

    ClassBase **ptr_array = new Base*[dimension];

но когда я пытаюсь сделать:

     ptr_array[0]=new ChildClass;
*ptr_array[0]=ChildIWantToCopy;

он только копирует атрибуты ClassBase.

Есть идеи? заранее спасибо

РЕДАКТИРОВАТЬ: Спасибо большое, к сожалению, я не могу использовать ссылки, потому что каким-то образом мой массив сходит с ума и использует только первую позицию массива, несмотря ни на что. Я буду продолжать исследовать это.
еще раз спасибо

EDIT2:

Когда я пытаюсь сделать это так

    ptr_array[0]=&ChildIWantToCopy;

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

EDIT3:
Объявления операторов присваивания:
Класс базового клиента:

    virtual void operator=(Cliente const &cliente);

ChildClass человек:

   void operator=(Persona const &persona);

Компания ChildClass:

   void operator=(Empresa const &empresa);

2

Решение

Ваш полиморфный оператор присваивания не работает, потому что объявление в производном классе отличается от объявления в базовом классе. Прежде всего, оператор присваивания должен вернуть ссылку, поэтому измените ее на:

virtual Cliente &operator=(Cliente const &cliente);

И затем используйте то же самое объявление в дочерних классах:

Cliente &operator=(Cliente const &cliente);

Реализация для дочернего класса будет выглядеть примерно так:

Cliente &Persona::operator=(Cliente const &cliente)
{
if (this == &cliente)
return *this;

//See if the object being copied is another Persona
const Persona *pOther = dynamic_cast<const Persona *>(&cliente);

// if pOther is not null, cast was successful
if (pOther)
{
// Copy derived class attributes
// this->x = pOther->x, etc.
}

// Call base class operator=, to copy base class attributes
return Cliente::operator=(cliente);
}

Вы также можете определить второй оператор присваивания для производного класса, используя производный тип (например, Persona &operator=(Persona const &persona)). Но тот, который будет использоваться в вашем примере, это тот, который принимает Cliente const & в качестве параметра.

1

Другие решения

Других решений пока нет …