Al hacer que el constructor de copias sea privado, ayudará a evitar el corte inadvertido de objetos, donde se realiza una copia de una clase derivada pero se pierden todas las propiedades de esa clase derivada. Las clases derivadas pueden hacer que sus propios constructores de copia sean públicos y hagan lo correcto.
Hay un caso en el que el constructor de copia debe estar protegido en lugar de privado, cuando la clase abstracta tiene miembros de datos. Esto no sucede muy a menudo. La clase base puede copiar los miembros de la clase base mientras que la clase derivada copia sus propios miembros.
class AbstractBase
{
public:
AbstractBase(const std::string &init) : wtf(init) {}
virtual ~AbstractBase() {}
void DoSomething() = 0;
protected:
AbstractBase(const AbstractBase &r) : wtf(r.wtf) {}
const std::string wtf;
};
class Derived : public AbstractBase
{
public:
// ...
Derived(const Derived &r) : AbstractBase(r), moredata(r.moredata) {}
private:
int moredata;
};
Es imposible para el constructor de la clase base hacer una copia de una clase derivada, por lo que no entiendo cuándo tendría sentido que sea pública. –
@MarkRansom Quise decir algo como [esto] (http://ideone.com/n2ndl), pero las personas aún podían implementar el constructor de copias en la clase derivada. –
Gracias, pensé que sí. Una pregunta de seguimiento, porque es privada y nunca se usará, no es necesario que haya código en el constructor de copia porque nunca se usará. ¿Es eso correcto? – Aaron