Esto podría ser una pregunta con una respuesta obvia o un duplicado. Si es así, lo siento, lo eliminaré.¿Por qué los constructores de copia no están "encadenados" como constructores o destructores predeterminados?
¿Por qué los constructores de copia no están encadenados (como los ctors o dtors predeterminados) para que se llame al constructor de copia de la clase base antes de llamar al constructor de copia de la clase derivada? Con los constructores de copia y los destructores, se llaman en una cadena de base a derivada y derivada a base, respectivamente. ¿Por qué no es este el caso para los constructores de copia? Por ejemplo, este código:
class Base {
public:
Base() : basedata(rand()) { }
Base(const Base& src) : basedata(src.basedata) {
cout << "Base::Base(const Base&)" << endl;
}
void printdata() {
cout << basedata << endl;
}
private:
int basedata;
};
class Derived : public Base {
public:
Derived() { }
Derived(const Derived& d) {
cout << "Derived::Derived(const Derived&)" << endl;
}
};
srand(time(0));
Derived d1; // basedata is initialised to rand() thanks to Base::Base()
d1.printdata(); // prints the random number
Derived d2 = d1; // basedata is initialised to rand() again from Base::Base()
// Derived::Derived(const Derived&) is called but not
// Base::Base(const Base&)
d2.printdata(); // prints a different random number
El constructor de copia no (no puede) realmente hacer una copia del objeto, porque no pueden acceder a Derived::Derived(const Derived&)
basedata
para cambiarlo.
¿Hay algo fundamental que me falta acerca de los constructores de copia para que mi modelo mental sea incorrecto, o hay algún motivo arcano (o no misterioso) para este diseño?
@ybungalobill ha demostrado que es posible, y bastante fácil. Creo que su pregunta es "¿por qué no están encadenados *** automáticamente?" –
@ AaronMcDaid Sí, esa es mi pregunta, pero también se ha respondido a continuación –
@BenVoigt Sí, me preguntaba por qué no se escribe explícitamente, como un constructor explícitamente escrito. Pero esta pregunta ya fue respondida hace un tiempo –