Questa potrebbe essere una domanda con una risposta ovvia o un duplicato. Se è così, mi dispiace, lo cancellerò.Perché i costruttori di copie non sono "concatenati" come costruttori o distruttori predefiniti?
Perché i costruttori di copie non sono concatenati (come i sensori oi dors di default) cosicché prima che venga chiamato il costruttore di copie della classe derivata, viene chiamato il costruttore di copie della classe base? Con i costruttori e i distruttori di copia, vengono chiamati rispettivamente in una catena da base a derivata e da derivata a base. Perché non è questo il caso dei costruttori di copie? Ad esempio, questo codice:
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
Il costruttore di copia non (non può) davvero fare una copia dell'oggetto, perché Derived::Derived(const Derived&)
non possono accedere basedata
di cambiarlo.
C'è qualcosa di fondamentale che mi manca nei confronti dei costruttori di copie in modo che il mio modello mentale non sia corretto, o ci sia qualche motivo arcano (o non arcano) per questo progetto?
@ybungalobill ha dimostrato che è possibile, e abbastanza facile. Penso che la tua domanda sia "perché non sono incatenati *** *** automaticamente?" –
@AaronMcDaid sì questa è la mia domanda, ma anche questa è stata risposta sotto –
@BenVoigt si, mi stavo chiedendo perché uno non scritto esplicitamente, come un costruttore scritto esplicitamente, ma questa domanda aveva già avuto risposta qualche tempo fa –