int main(int argc, char* argv[])
KlasaNaucz t1;
KlasaPrac s1;
cout « tl.nldNaucz « endl; cout « sl.nldPrac « endl;
return 0;
Użycie unii nie daje bezpieczeństwa związanego ze zgodnością typów. Każda ze j składowych unii może zostać użyta w dowolnej chwili. Jeśli więc w klasie przechowujemy różne wartości w zależności od obiektu, do którego odnosi się klasa, to nie ] mamy możliwości sprawdzenia, że do konkretnego obiektu dostęp uzyskuje właściwa j składowa unii.
Na przykład we fragmencie „Przed” mamy klasę, która przechowuje informacje o pracownikach. Jeśli dane dotyczą nauczyciela, to zostaje użyta zmienna nldNaucz, I jeśli natomiast osobę z działu technicznego, to zostaje użyta zmienna nldPrac. Ponie- i waż osoba jest albo nauczycielem albo pracownikiem technicznym, zaoszczędziliśmy i trochę miejsca, łącząc w unii dwie możliwe wartości.
Mimo że moglibyśmy dodać flagę oznaczającą, do której grupy zalicza się dany pracownik, kompilator nie może zapewnić, że na przykład w wypadku nauczycieli uzyskujemy dostęp tylko do zmiennej nldNaucz. Kompilatora to nie obchodzi. Jeśli zapomnimy o sprawdzeniu, do jakiego obiektu się odnosimy, to możemy rozpętać istne pandemonium.
We fragmencie „Po” utworzyliśmy klasę podstawową ze zmiennymi składowymi wspólnymi dla obu klas. Następnie utworzyliśmy klasy pochodne — jedną tylko dla nauczycieli i jedną tylko dla pracowników technicznych. Mimo że kod jest wówczas odrobinę bardziej kosztowny, zapewniamy sobie bezpieczeństwo zgodności typów. Kompilator uniemożliwi nam próbę uzyskania dostępu do zmiennej nldPrac z klasy nauczycieli lub zmiennej nldNaucz z klasy pracowników technicznych.
unikanie nieoczekiwanych wyników
Przed
class uKlasa
public:
uKlasa() : nldNaucz(O), fltPensja(0.), nldPrac(3)