Per un momento, supponiamo che "l'ereditarietà del costruttore di copie" sia consentita. Avendo la struttura della classe intatta, considerare il seguente codice per il metodo principale modificato.
int main() {
C c;
D d;
D d_from_d(d);
D d_from_c(c); // does not compile, copy ctor is not inherited
D d_from_int(1); // compiles, C(int) is inherited
}
In D d_from_d(d)
, come una normale chiamata costruttore, ci saranno due chiamate costruttore di copia. Uno per C :: C (const C &) e l'altro per costruttore di copia generato dal compilatore per D. Avendo tipo oggetto di origine in D (d in questo caso), il costruttore di copia di C può copiare gli attributi di C mentre il compilatore genera la copia di il costruttore può copiare l'attributo D di d's.
Ma nel caso D d_from_c(c)
, Non c'è alcun problema per il costruttore di copie di C perché, gli attributi C di c possono essere copie dal costruttore di copie di C. Ma come ha fatto il compilatore a generare il costruttore di copie di D sa come copiare gli "attributi di D dall'oggetto di C". Questo è un conflitto che dovrebbe essere evitato.
Ma, se si fornisce una sorta di "strano costruttore di copie" (potrebbe essere necessario anche un costruttore predefinito) come;
D(const C & c):C(c){}
Poi, chiedono D d_from_c(c);
è valido. Perché, ora abbiamo esplicitamente fornito un costruttore di "copia" corrispondente.
Quindi, dire "L'ereditarietà dei costruttori di copia ora è consentita" non è valida.