2

我在 C++ 中遇到了多态数组的问题。我有:

    ClassBase **ptr_array = new Base*[dimension]; 

但是当我尝试这样做时:

     ptr_array[0]=new ChildClass; 
    *ptr_array[0]=ChildIWantToCopy; 

它只复制 ClassBase 的属性。

有任何想法吗?提前致谢

编辑:非常感谢,不幸的是我不能使用引用,因为不知何故我的数组变得疯狂并且只使用数组的第一个位置,无论如何。我会继续研究它。再次感谢

编辑2:

当我尝试这样做时

    ptr_array[0]=&ChildIWantToCopy;

不知何故,我的数组变得疯狂,它总是在第一个位置复制。事实上,如果孩子在分配任何东西之前已经在其中,我会检查整个数组,即使它不在数组中,它也会说它是并复制孩子,(不应该,因为如果孩子在里面,我会做它避免了分配)。这真让我抓狂。

EDIT3:赋值运算符的声明:类基客户端:

    virtual void operator=(Cliente const &cliente); 

ChildClass 人:

   void operator=(Persona const &persona);  

童班公司:

   void operator=(Empresa const &empresa);
4

1 回答 1

1

您的多态赋值运算符不起作用,因为派生类中的声明与基类中的声明不同。首先,赋值运算符应该返回一个引用,因此将其更改为:

virtual Cliente &operator=(Cliente const &cliente); 

然后在子类中使用相同的声明:

Cliente &operator=(Cliente const &cliente); 

子类的实现将如下所示:

Cliente &Persona::operator=(Cliente const &cliente)
{
    if (this == &cliente)
        return *this;

    //See if the object being copied is another Persona
    const Persona *pOther = dynamic_cast<const Persona *>(&cliente);

    // if pOther is not null, cast was successful
    if (pOther)
    {
        // Copy derived class attributes
        // this->x = pOther->x, etc.
    }

    // Call base class operator=, to copy base class attributes
    return Cliente::operator=(cliente);
}

您还可以使用派生类型(例如Persona &operator=(Persona const &persona))为派生类定义第二个赋值运算符。但是将在您的示例中使用的那个是将 aCliente const &作为参数的那个。

于 2013-05-30T16:03:34.937 回答