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 类型的对象i为奇数或偶数。如果我知道这一点,那么我就知道如何为 D 编写operator=和复制构造函数。但是如果类 D 构造函数会随机生成 B 或 C 类型的对象,那么我该如何编写复制构造函数(和 operator= ) 对于 D 类?我的猜测是我必须使用typeid运算符来解决这个问题。