C ++:在堆分配之前使用typeid

时间:2013-02-09 12:46:36

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

1 个答案:

答案 0 :(得分:1)

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