2011-01-11 15 views
11

Co to jest wskaźnik wirtualny? Cześć, WSZYSTKO, Dzisiaj miałem wywiad telefoniczny i dostałem pytanie: "Co to jest wskaźnik wirtualny?" Natknąłem się na ten, więc po jego zakończeniu próbowałem Google. Niestety, dało mi to tylko odniesienia do wirtualnych tabel.Wskaźnik wirtualny

Co to jest wirtualny wskaźnik w prostym języku angielskim? Jak to zdefiniujesz?

Dziękuję.

+5

O ile mi wiadomo, nie ma czegoś takiego, chyba że Twój ankieter mówił o jednym wpisie w strukturze vtbl. –

+1

Wirtualna tabela * wskaźnik? –

+0

To było zaawansowane pytanie do wywiadu, aby sprawdzić, jak dobrze znasz szczegóły implementacji modelu obiektowego C++. –

Odpowiedz

14

Nie ma czegoś takiego jak "wirtualny wskaźnik".

Istnieje kilka rzeczy, ankieter może mieć na myśli:

  • Wskaźnik do polimorficznych klasy
  • Wskaźnik do vtable polimorficznego klasy (@Maxim kredytowej)
  • Wskaźnik zasięgu vtable z polimorficznych klasy
  • obiekt inteligentny wskaźnik z zastąpionej operator->
  • wskaźnik do funkcji członka wirtualnego (kredyt @ Matthieu M)

Ale jeśli chodzi o "wirtualny wskaźnik", nie ma czegoś takiego.

+0

@John: Dodałbym, wskaźnik do funkcji wirtualnego członka do listy prawdopodobnych możliwości. –

+0

@Matthieu: Dobra sugestia, zredagowana. –

+0

Najprawdopodobniej zakończy się to niepowodzeniem przy użyciu jednej z powyższych odpowiedzi. –

4

Moja interpretacja byłaby następująca: zawartość vtable-pointers do wirtualnych metod.

Niezbyt dobre brzmienie, IMHO.

1

Może to oznacza również utworzyć wskaźnik funkcji virtual/wirtualny czystego metoda A ojca i wywołać ją z dzieckiem, wciąż nie jest to dobre sformułowanie ...

2

C++ kompilator tworzy ukryty członkiem klasy o nazwie wirtualnego -pointer lub w skrócie vptr, gdy istnieje jedna lub więcej funkcji wirtualnych. Ta vptr jest wskaźnikiem wskazującym tabelę wskaźników funkcji. Ta tabela jest również tworzona przez kompilator i nazywana wirtualną tabelą funkcji lub tabelą vtable. Każdy wiersz tabeli vtable jest wskaźnikiem funkcji wskazującym odpowiednią funkcję wirtualną.

Aby wykonać późniejsze wiązanie, kompilator tworzy tę tabelę vtable dla każdej klasy zawierającej funkcje wirtualne i dla klasy pochodnej. Kompilator umieszcza adresy funkcji wirtualnych dla tej konkretnej klasy w "vtable".

Gdy wywołanie funkcji wirtualnej odbywa się za pomocą wskaźnika bazowego, kompilator po cichu wstawia kod w celu pobrania VPTR i wyszukiwania adresu funkcji w VTABLE, wywołując w ten sposób odpowiednią funkcję i powodując późniejsze/dynamiczne wiązanie .