0
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运算符来解决这个问题。

4

1 回答 1

1

将纯虚拟方法定义clone为接口A定义的一部分 -clone应返回对象的副本。B在您的每个和C类中覆盖并实现它。在D类中复制构造函数和赋值运算符实现使用A's 接口来创建所需的类实例,而不是显式调用new: v[i] = other.v[i]->clone();。不需要RTTI,正常的多态性就可以了。

于 2013-02-09T13:14:24.277 回答