2013-12-15 2 views
3

У меня есть класс (назовем его A), и я хочу скопировать A. Поэтому я вызываю конструктор копии A. A имеет член типа B *, который является указателем типа B на один из его подклассов (назовем их B числом (т.е.: B1, B5, ..)) Поскольку я не хочу просто скопируйте адрес, я вызываю memberofA-> copyconstructor из одного из подклассов. Конструктор копирования в базовом классе вызывается из конструктора копирования подкласса. Но возможно ли это или мне нужно динамическое преобразование указателя типа baseclass в правильный подкласс, указатель тоже указывает?конструктор копирования для baseclasspointer для подкласса

class A { 
public: 
    A(const A& object) { 
     // what should i call here to deep copy member 
     } 
private: 
    B* member //pointer to subclass of B 
    }; 

class B { 
    privatedatamamber 
    public: 
    B (const B& object) { 
     privatedatamember = object->getprivatedatamember(); 
    } 
    }; 

    class B1 : public B { 
    privatedatamember 
    public: 
    B1 (const B1& object) : B(object) { 
     privatedatamember = object->getprivatedatamember(); 
    } 
    }; 

ответ

3

Добавить публичную функцию B: подклассы

virtual B* Clone() = NULL; 

B должен осуществить это (чисто виртуальную функцию). Вот пример:

В заголовок:

virtual B* Clone() = 0; //public 

заголовка В1:

virtual B* Clone(); 

В1 CPP:

B* B1::Clone() 
{ 
    return new B1(*this); 
} 

А:

A::A(const A& object) : member(object.member->Clone()) { 
} 
+0

B1 (* this) вызывает экземпляр копии экземпляра B1? – user2321611

+0

Не должно быть: A :: A (const A & object): member ((A.getmember) -> clone()) {} – user2321611

+0

@ user2321611 - для первого комментария ответ да, в этом суть, если виртуальных функций. Для второго у меня была ошибка. Я исправил ответ. – egur

3

Подход, который я хотел бы использовать, чтобы дать B абстрактный метод clone() возвращает std::unique_ptr<B>, который реализуется в каждом конкретном классе возвращает копию, например:

std::unique_ptr<B> D::clone() const { 
    return std::unique_ptr<B>(new D(*this)); 
} 

Когда глубокая копия вам нужно было просто позвонить clone().

+0

Что такое D? – user2321611

+0

@ user2321611: 'D' является просто заполнителем для любого конкретного класса, полученного из' B', например, для примера вы реализуете это переопределение для 'B1' и любого другого конкретного класса, полученного из' B'. –

+0

Итак, мой copyconstructor в A вызывает A'smember-> clone(); А клон определяется в B1? – user2321611

Смежные вопросы