2. Z polimorfizmem - wywołany zostanie wskaźnik do odpowiedniej metody przechowywany w tablicy metod wirtualnych obiektu. Jeżeli do x przypisaliśmy obiekt klasy derive, wywoła się przeciążona metoda. Jeżeli zaś obiekt klasy base, wtedy podstawowa.
Czym są metody (funkcje) wirtualne?
Są to metody poprzedzone słowem kluczowym virtual. Są realizacją polimorfizmu. Zadeklarowanie metody jako wirtualnej powoduje, że jej adres zostaje zapamiętany w tablicy metod wirtualnych, do której wskaźnik trafia do każdego obiektu tej klasy. Wywołując taką metodę nawet po zrzutowaniu obiektu do klasy nadrzędnej, zostanie wywołana "ta właściwa" - wybór konkretnej metody następuje w momencie wykonania programu, a nie kompilacji, na podstawie tablicy metod wirtualnych.
Czym się różni dziedziczenie zwykłe od wirtualnego?
Różnice dotyczą dziedziczenia wielokrotnego. Załóżmy następującą sytuację: klasa D dziedziczy z B i C, a obie te klasy dziedziczą z klasy A.
1. Przy dziedziczeniu zwykłym wszystkie elementy klasy A zostaną powielone dwukrotnie w klasie D, co prowadzi do niejednoznaczności.
2. Przy dziedziczeniu wirtualnym wszystkie elementy klasy A wystąpią w klasie D dokładnie jeden raz.
Kiedy klasa powinna mieć destruktor wirtualny?
Klasa powinna mieć destruktor wirtualny zawsze, gdy mamy w niej choć jedną metodę wirtualną.
Czy i ew. kiedy można jawnie wywołać destruktor klasy?
W sytuacji gdy korzystamy z "placement new" (umieszczanie obiektów w ściśle określonym miejscu pamięci), bierzemy całkowitą odpowiedzialność za zniszczenie stworzonych tak obiektów. Wtedy można, a nawet trzeba jawnie wywołać destruktor.
W jakiej kolejności niszczone są obiekty?
Obiekty są niszczone w odwrotnej kolejności do tej, jak były tworzone (tj. pierwszy utworzony = ostatni zniszczony). Analogiczna sytuacja dotyczy obiektów umieszczonych w tablicach.
W jakiej kolejności wywoływane są destruktory obiektu?
Kolejno od najwyżej położonej klasy pochodnej do klasy bazowej. Jeżeli jakaś klasa dziedziczy po kilku innych, ich destruktory wywoływane są w odwrotnej kolejności, niż zostały wymienione na liście dziedziczonych klas.
3 z 13