class A
{
protected:
int a;
public:
A();
A(int);
virtual void print()=0;
virtual ~A();
};
class B: public A
{
int b;
public:
B();
B(int,int); //initialize attributes a and b
void print(); //print a and b
};
class C: public A
{
float c;
public:
C();
C(float,int); //initialize attributes a and c
void print(); //print a and c
};
class D
{
int size; //number of objects in v
A **v; /* an array(a vector) of A pointers that allows me to have both B and C type objects */
public:
D();
D(int);
D(D&);
~D();
D operator=(const D&);
void PrintAll();
};
Все методы для D:
D::D()
{
v=NULL;
}
D::D(int x)
{
size=x;
v=new A*[x];
for(int i=0;i<x;i++)
{
if(i%2==0)
v[i]=new B(4,7);
else
v[i]=new C(3,5);
}
}
D::D(D& other)
{
size=other.size;
v=new A*[size];
for(int i=0;i<size;i++)
{
if(i%2==0)
{
v[i]=new B();
*v[i]=other.v[i][0];
}
else
{
v[i]=new C();
*v[i]=other.v[i][0];
}
}
}
D::~D()
{
if(v!=NULL)
{
for(int i=0;i<size;i++)
{
delete v[i];
}
delete[] v;
}
}
D D::operator=(const D& other)
{
if(v!=NULL)
{
for(int i=0;i<size;i++)
{
delete v[i];
}
delete[] v;
}
size=other.size;
v=new A*[size];
for(int i=0;i<size;i++)
{
if(i%2==0)
{
v[i]=new B();
*v[i]=other.v[i][0];
}
else
{
v[i]=new C();
*v[i]=other.v[i][0];
}
}
return *this;
}
void D::PrintAll()
{
cout<<"Printall():"<<endl;
for(int i=0;i<size;i++)
v[i]->print();
}
Как видите, конструктор класса D делает объекты типа B или C как я странный или четный Если я знаю это, то я знаю, как написать оператор = и конструктор копирования для D. Но если конструктор класса D будет создавать объекты типа B или C случайным образом, то как я могу написать конструктор копирования (и operator =) для класса D? Я думаю, я должен использовать TypeId Оператор, чтобы решить эту проблему.
Определите чисто виртуальный метод clone
как часть вашего интерфейса A
определение — clone
должен вернуть копию объекта.
Переопределите и внедрите его в каждом из ваших B
а также C
классы.
В D
реализации конструктора копирования класса и использования оператора присваивания A
интерфейс для создания необходимого экземпляра класса вместо явного вызова new
: v[i] = other.v[i]->clone();
, Нет необходимости RTTI
нормальный полиморфизм подойдет.
Других решений пока нет …