Pochodnal ()
cout « "konstruktor Pochodnal\n";
};
Pochodnal d1(*pd1);
Po
dass Pochodnal : public bazal
public:
Pochodnal (Pochodnal &pochodna1) : bazal (pochodnal)
cout « "konstruktor kopiowania Pochodnal \n";
Pochodnal ()
cout « "konstruktor Pochodnal\n";
};
Pochodnal d1(*pd1);
Jeśli nie określimy, którego konstruktora używamy, to kompilator automatycznie wybierze domyślny konstruktor. Często nie ten, o który nam chodzi, zwłaszcza wówczas, gdy stosuje się dziedziczenie. We fragmencie „Przed” klasa Pochodnal jest klasą pochodną klasy bazal. W klasie Pochodnal są dwa konstruktory — konstruktor domyślny i konstruktor kopiowania. Fragment kodu tworzący klasę dl jawnie wywołuje konstruktor kopiowania. Co się wówczas dzieje?
Po pierwsze zostaje wywołany konstruktor kopiowania klasy Pochodnal. To powoduje niejawne wywołanie konstruktora klasy bazal. Ale którego? Domyślnego, oczywiście. A więc gdy wywołaliśmy konstruktor kopiowania dla klasy pochodnej, wcale nie wywołaliśmy konstruktora kopiowania dla klasy podstawowej. Jak widzieliśmy w innych wskazówkach, to może prowadzić do powstania błędów, zwłaszcza wtedy, gdy klasa przydziela pamięć. (Informacje na ten temat zawiera wskazówka 94.) Przeanalizujmy teraz fragment „Po”. Tym razem konstruktor kopiowania dla klasy Pochodnal jawnie wywołuje konstruktor kopiowania klasy podstawowej. Dlatego podczas tworzenia klasy dl zostaje wywołany konstruktor kopiowania klasy Pochodnal, a następnie konstruktor kopiowania klasy bazal. Każde kopiowanie wymagane przez klasę podstawowąjest zatem obsługiwane poprawnie.
Przykład: TestYirtualDTor w pliku inherit.cpp