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的对象随机,然后如何为D类编写复制构造函数(和operator =)?我的猜测是我必须使用 typeid 运算符来解决这个问题。
答案 0 :(得分:1)
将纯虚方法clone
定义为接口A
定义的一部分 - clone
将返回对象的副本。
在每个B
和C
类中覆盖并实现它。
在D
类复制构造函数和赋值运算符实现中,使用A
的接口来创建所需的类实例,而不是显式调用new
:v[i] = other.v[i]->clone();
。不需要RTTI
,正常的多态性就可以。