полиморфизм — C ++: использование typeid перед выделением кучи

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 Оператор, чтобы решить эту проблему.

0

Решение

Определите чисто виртуальный метод clone как часть вашего интерфейса A определение — clone должен вернуть копию объекта.
Переопределите и внедрите его в каждом из ваших B а также C классы.
В D реализации конструктора копирования класса и использования оператора присваивания Aинтерфейс для создания необходимого экземпляра класса вместо явного вызова new: v[i] = other.v[i]->clone();, Нет необходимости RTTIнормальный полиморфизм подойдет.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]