Przez chwilę przyjmiemy, że "dziedziczenie konstruktora kopii" jest dozwolone. Mając strukturę klas nienaruszoną, rozważ następujący kod dla zmodyfikowanej metody głównej.
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
}
W D d_from_d(d)
, jako normalnego wywołania konstruktora, będzie dwa połączenia konstruktor kopiujący. Jeden dla C :: C (const C &), a drugi dla konstruktora kopiowania generowanego przez kompilator dla D. Mając typ obiektu źródłowego w D (d w tym przypadku), konstruktor kopii C może skopiować atrybuty D's C podczas kompilacji wygenerowanej przez D's kopii konstruktor może skopiować atrybut d's D.
W przypadku nie ma problemu z konstruktorem kopiowania C, ponieważ atrybuty C c mogą być kopiowane przez konstruktora kopii C. Ale w jaki sposób kompilator wygenerował konstruktora kopii D, który zna sposób kopiowania "atrybutów D'z obiektu C". Jest to konflikt, którego należy unikać.
Ale jeśli podasz jakiś "dziwny konstruktor kopii" (być może będziesz potrzebował domyślnego konstruktora);
D(const C & c):C(c){}
Następnie nazywając D d_from_c(c);
jest prawidłowy. Ponieważ teraz wyraźnie udostępniliśmy pasujący konstruktor "kopiuj".
Tak więc powiedzenie "Dziedziczenie konstruktorów kopii jest teraz dozwolone" jest nieprawidłowe.