pamiętnik programisty

15 maj, 2009

Funkcje wirtualne w c++

Zamieszczony przez: pejotr w: C++|Programowanie

Mechanizm funkcji wirtualnych, występujący także pod nazwą „późnego wiązania”, jest bardzo ważny elementem języka programowania. Pozwala na wywołania innej wersji metody w zależności od obiektu na rzecz którego metoda jest wywoływana.  Największe zastosowanie funkcji wirtualnych to umożliwienie przechowywanie obiektów w kolekcjach jako obiektów klasy bazowej, a wywoływanie metod które dotyczą faktycznego typu obiektu.
O ile w przypadku funkcji niewirtualnych kompilator nie ma problemu z obliczeniem adresu funkcji w czasie kompilacji i konsolidacji, a wywołanie odnosi się do obliczonego statycznego adresu.
W przypadku funkcji wirtualnych sprawa wygląda trochę inaczej, ponieważ funkcja którą należy wywołać zależy również od typu obiektu na rzecz którego następuje próba wywołania. Dlatego kompilator tworzy sobie dla każdej klasy tabelę wywołań funkcji wirtualnych v-table. Tabela jest tworzona 1 dla jednej klasy i jest wspólna dla wszystkich obiektów danej klasy. Tabela v-table jest tworzona tylko wtedy gdy została zadeklarowana przynajmniej jedna funkcja wirtualna. Każda klasa ma wskaźnik na tabelę funkcji wirtualnych z której korzysta kiedy ma wywołać metodę która została zadeklarowana jako wirtualna. Wskaźnik tablicy wirtualnej jest zazwyczaj pierwszym elementem obiektu. Wynikający z istnienia vtable narzut pamięciowy jest raczej skromny. Rozmiar obiektu rośnie o wielkość samego wskaźnika, czyli o 4KB a zapotrzebowanie całego programu jest wprost proporcjonalne do ilości funkcji wirtualnych.
ovp-fig6

1 odpowiedź na "Funkcje wirtualne w c++"

1 | pejotr

11. Styczeń 2010 o 21:59

Avatar

Bomba, tak napisałem że już teraz nie wiem co miałem na myśli. W każdym razie idea polega na tym że, jak napisałem, każda klasa (posiadająca funkcje wirtualne) posiada wskaźnik do tabeli odwołań wirtualnych umieszczony na początku klasy. Jeżeli odziedziczymy klasę, to tabela ta jest „nadpisywana” tak że wywołania funkcji wirtualnych, mimo że wywołane na obiekcie bazowym, powodują uruchomienie funkcji „prawdziwej” klasy obiektu.

Formularz komentarza

*

O mnie:

pejotrWitam, nazywam się Piotr Doniec, w internecie występuję pod nickami 'pejotr' oraz 'doniczek'. Obecnie jestem studentem 3 roku informatyki na Politechnice Warszawskiej na wydziale Elektroniki i Technik Informacyjnych.

Kategorie