1

Есть ли способ скопировать объект производного класса через указатель на базу? Или как создать такой конструктор копии?Есть ли способ скопировать объект производного класса через указатель на базу?

Например:

class Base { 
public: Base(int x) : x(x) {} 
private: int x; 
}; 

class Derived1 : public Base { 
public: 
Derived(int z, float f) : Base(z), f(f) {} 
private: 
float f; 
}; 

class Derived2 : public Base { 
public: 
Derived(int z, string f) : Base(z), f(f) {} 
private: 
string f; 
}; 

void main() 
{ 
Base * A = new *Base[2]; 
Base * B = new *Base[2]; 
A[0] = new Derived1(5,7); 
A[1] = new Derived2(5,"Hello"); 
B[0] = Base(*A[0]); 
B[1] = Base(*A[1]); 
} 

вопрос, является ли * В [0] будет объектом Derived1 и * B [1] объект Derived2? Если нет, как я могу скопировать производный класс через указатель на базовый класс? Есть ли конкретный способ построения конструктора-копии через базовый класс или производный? Является ли конструктор копирования по умолчанию достаточным для примера?

+0

Посмотрите [* шаблон клона *] (https://katyscode.wordpress.com/2013/08/22/c-polymorphic-cloning-and-the-crtp-curiously-recurring-template-pattern/). – Quentin

+1

«База» A = новая * База [2]; 'опечатка? Это не скомпилируется. На самом деле, весь ваш метод main() полон проблем. – mbgda

+0

Я считаю, что полиморфные копии идиоматически реализованы с помощью метода под названием «Clone()» (вам нужно будет написать метод clone самостоятельно), и вы в основном пишете его так, как вы строите конструктор, но, как говорит @Quentin, найдите клон шаблон для специфики. – YoungJohn

ответ

5

Вы можете предоставить виртуальный метод Clone для этого:

class Base { 
public: 
    Base(int x) : x(x) {} 
    virtual ~Base() {} 
    virtual Base* Clone() const { return new Base(*this); } 
private: 
    int x; 
}; 

class Derived1 : public Base { 
public: 
    Derived1(int z, float f) : Base(z), f(f) {} 
    virtual Derived1* Clone() const { return new Derived1(*this); } 
private: 
    float f; 
}; 

class Derived2 : public Base { 
public: 
    Derived2(int z, std::string f) : Base(z), f(f) {} 
    virtual Derived2* Clone() const { return new Derived2(*this); } 
private: 
    std::string f; 
}; 
0

Во второй строке вашего main (кроме опечатка) вы построить два экземпляра класса Base, то вы спрашиваете, если каким-то образом в в последних двух строках эти объекты метаморфозу «на лету» и становятся экземплярами производных классов. Это, конечно, невозможно.

Кроме того, отметьте это answer.

Примечание: Я просто комментирую код и используемый вами случай использования. Использование виртуальной функции Clone - это правильный дизайн для копирования полиморфных объектов.

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