123 TIF

123 TIF



baza2()

{

cout« "konstruktor baza2\n";

}

virtual ~baza2()

{

cout« "destruktor baza2\n”;

}

};

class Pochodna2 : public baza2

{

public:

~Pochodna2()

{

cout« "destruktor Pochodna2\n";

}

};

Jeśli spodziewamy się, że kiedyś nasza klasa będzie dziedziczona, to destruktor musi być wirtualny. Jeśli nie planujemy utworzenia destmktora, bo nie ma nic do usunięcia, to lepiej jednak dodać wirtualny destruktor niezawierający kodu.

Po co to wszystko? Pamiętajmy, że możemy używać wskaźników do klas podstawowych w celu manipulowania klasami pochodnymi. Rozważmy klasę Pochodna2 pokazaną we fragmencie „Przed”. Jak widzimy, dziedziczy ona po klasie baza2. Rozważmy kod:

Pochodna2 *pd2; pd2 = new Pochodna2; delete pd2;

Tworzymy tutaj i usuwamy wskaźnik do klasy pochodnej. Wszystko zadziała bezbłędnie, zostanie usunięta zarówno klasa pochodna, jak i klasa podstawowa.

A załóżmy, że użyjemy kodu:

Pochodna2 *pd2; baza2 *pdb; pd2 = new Pochodna2; pdb = (baza2 *) pd2; delete pdb;

W tym nowym kodzie rzutujemy wskaźnik na klasę podstawową i usuwamy go. Destruktor jednakże nie jest wirtualny. A zatem zostaje wywołany tylko destruktor dla klasy podstawowej (baza2), ale destmktor dla wskazywanej klasy pochodnej (Pochodna2) nie zostanie wywołany. Niedobrze!


Wyszukiwarka

Podobne podstrony:


221 tif 221 3.2.2. Dachowe konstrukcje inżynierskie W kształtowaniu dachowych konstrukcji ciesielski
W kodzie poprawionym destruktor klasy baza2 jest wirtualny. Wykonanie fragmentu „Po” spowoduje wywoł


pds059 (2) tif Podstawy konstruowania programów w języku Asembler 59 wym może być też symbol zdefini
pds061 (2) tif Podstawy konstruowania programów w języku Asembler 61 adresowanie pośrednie stwarza m
pds063 (2) tif Podstawy konstruowania programów w języku Asembler 63 asembler MASM praktycznie różni
PA1801b tif 224 223 24 123, M 303,114w    m 212    2„% 213
71655 Zdjęcie0140 (11) Gaduła :Gadula(lnt k, char *Opls) //konstruktor { strcpy(Tekst, Opis); Ucz =

więcej podobnych podstron