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 クラス コンストラクターは、iが奇数または偶数であるため、型 B または C のオブジェクトを作成します。これがわかれば、D のoperator=コピー コンストラクターの書き方がわかります。しかし、クラス D コンストラクターが型 B または C のオブジェクトをランダムに作成する場合、コピー コンストラクター (および operator= ) クラス D の場合は? 私の推測では、この問題を解決するにはtypeid演算子を使用する必要があります。

4

1 に答える 1

1

cloneインターフェイス定義の一部として純粋仮想メソッドを定義しAます -cloneオブジェクトのコピーを返します。BあなたのとCクラスのそれぞれでそれをオーバーライドして実装します。Dクラス コピー コンストラクターと代入演算子の実装では、 :Aを明示的に呼び出す代わりに、 のインターフェイスを使用して必要なクラス インスタンスを作成しnewますv[i] = other.v[i]->clone();。は必要ありませんRTTI。通常のポリモーフィズムで十分です。

于 2013-02-09T13:14:24.277 に答える