Вектор указателя на объекты, требуется глубокая копия вектора, но объекты являются основой унаследованных объектов - PullRequest
4 голосов
/ 24 ноября 2010

Я хочу иметь глубокую копию вектора с указателями на объекты, но объект может быть либо C, либо B. Я знаю, что сбивает с толку (как я это объясняю), позвольте мне проиллюстрировать.

class A {
    A(const A& copyme) { }
    void UnableToInstantiateMeBecauseOf() =0;
};

class B {
    B(const B& copyme) : A(copyme) {}
};

class C {
    C(const C& copyme) : A(copyme) {}
};

std::vector<A*>* CreateDeepCopy(std::vector<A*>& list)
{
    std::vector<A*>* outList = new std::vector<A*>();

    for (std::vector<A*>::iterator it = list.begin(); it != list.end(); ++it)
    {
        A* current = *it;
        // I want an copy of A, but it really is either an B or an C
        A* copy = magic with current;
        outList->push_back(copy);
    }

    return outList;
}

Как создать копию объекта, у которого нет наследуемого типа?

Ответы [ 4 ]

4 голосов
/ 24 ноября 2010

Использовать клонирование:

Скопировать объект - сохранить полиморфизм

class Super
{
public:
    Super();// regular ctor
    Super(const Super& _rhs); // copy constructor
    virtual Super* clone() const = 0; // derived classes to implement.
}; // eo class Super


class Special : public Super
{
public:
    Special() : Super() {};
    Special(const Special& _rhs) : Super(_rhs){};
    virtual Special* clone() const {return(new Special(*this));};
}; // eo class Special

РЕДАКТИРОВАТЬ:

Я заметил в вашем вопросе ваш базовый класс:Аннотация.Это нормально, эта модель все еще работает, я исправил.

2 голосов
/ 24 ноября 2010

Как уже говорили другие, вам нужен некоторый тип механизма клонирования.Возможно, вы захотите проверить cloning_ptr Кевлина Хенни в его превосходной статье Clone Alone .

2 голосов
/ 24 ноября 2010

Вы можете реализовать функцию чисто виртуального клона в классе A.

2 голосов
/ 24 ноября 2010

Добавьте виртуальный метод Clone () к вашим классам.

A* copy = it->Clone();

class A {
    virtual A* Clone()
    {
        return new A(*this);
    }
};

Переопределить клон в производных классах. Реализация такая же, как с классом А.

...