Мне нужно скопировать-построить объект, одновременно изменив его тип на другой класс, являющийся членом той же иерархии классов. Я читал о полиморфных копирующих конструкторах и (надеюсь) понял идею, стоящую за этим. Тем не менее, я до сих пор не знаю, применим ли этот шаблон к моему делу и, если да, то как его реализовать. Я думаю, что будет лучше, если я покажу, что мне нужно на примере.
Существует класс Base
и два дочерних класса, Child1
и Child2
. Мне нужно создать объект типа Child2
на основе Child1
, т.е. больше всего мне нужно скопировать объект, на который указывает p_int
, с Child1
до Child2
. Я написал простую программу, чтобы проиллюстрировать это:
#include <iostream>
using namespace std;
class Base {
public:
Base() { p_int = new int; *p_int = 0; }
~Base() { delete p_int; }
virtual Base* clone() const = 0;
void setpInt(int val) { *p_int = val; }
void setInt(int val) { a = val; }
virtual void print() {
cout << "Base: ";
cout << (long)p_int << ":" << *p_int << " " << a << endl;
}
protected:
int* p_int;
int a;
};
class Child1 : public Base {
public:
Child1() {};
Child1(const Child1& child) {
p_int = new int (*child.p_int);
a = child.a + 1;
}
Base* clone() const { return new Child1(*this); }
void print() {
cout << "Child1: ";
cout << (long)p_int << ":" << *p_int << " " << a << endl;
}
};
class Child2 : public Base {
public:
Child2() {};
Child2(const Child2& child) {
p_int = new int (*child.p_int);
a = child.a + 1;
}
Base* clone() const { return new Child2(*this); }
void print() {
cout << "Child2: ";
cout << (long)p_int << ":" << *p_int << " " << a << endl;
}
};
int main() {
Child1* c1 = new Child1();
Child2* c2;
c1->setpInt(4);
c1->print();
c2 = (Child2*)c1->clone();
c2->print();
}
К сожалению, результат, как показано ниже, т.е. нет преобразования типа:
Child1: 162611224:4 0
Child1: 162611272:4 1
Что именно мне нужно реализовать, чтобы достичь того, что мне нужно? Я начинаю думать, что мне нужен механизм преобразования типов, а не полиморфный конструктор копирования, но я уже запутался.
РЕДАКТИРОВАТЬ: Спрашивается продолжение здесь