У меня проблема с полиморфными массивами в 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);
Ваш полиморфный оператор присваивания не работает, потому что объявление в производном классе отличается от объявления в базовом классе. Прежде всего, оператор присваивания должен вернуть ссылку, поэтому измените ее на:
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 &
в качестве параметра.
Других решений пока нет …