2011-01-11 12 views
11

Was ist virtueller Zeiger? Hallo, ALL, Heute hatte ich ein Telefoninterview und bekam eine Frage: "Was ist virtueller Zeiger?" Ich stolperte über dieses, also nachdem es fertig war, versuchte ich Google. Leider gab es mir nur eine virtuelle Tabellenangabe.Virtueller Zeiger

Also, was ist virtueller Zeiger in einfachem Englisch? Wie definierst du es?

Vielen Dank.

+5

Soweit mir bekannt ist, gibt es so etwas nicht, es sei denn, Ihr Interviewer sprach über einen einzigen Eintrag in der Vtbl-Struktur. –

+1

Virtuelle * Tabelle * Zeiger? –

+0

Es war eine erweiterte Interviewfrage, um herauszufinden, wie gut Sie die C++ Objektmodellimplementierungsdetails kennen. –

Antwort

14

Es gibt keinen "virtuellen Zeiger".

Es gibt ein paar Dinge, die Interviewer vielleicht gemeint haben:

  • Ein Zeiger auf eine polymorphe Klasse
  • Ein Zeiger auf die VTable einer polymorphen Klasse (Kredit @Maxim)
  • Ein Zeiger innerhalb die vtable einer polymorphen Klasse
  • ein Smartpointer-Objekt mit einem überschriebenen operator->
  • einem Zeiger auf eine virtuelle Mitgliedsfunktion (Kredit @ Matthieu M)

Aber so weit wie "virtueller Zeiger" betroffen ist, gibt es so etwas nicht.

+0

@John: Ich würde hinzufügen, Zeiger auf virtuelle Member-Funktion auf die Liste der wahrscheinlichen Möglichkeiten. –

+0

@Matthieu: Guter Vorschlag, bearbeitet. –

+0

Sie würden wahrscheinlich das Interview mit einer der obigen Antworten scheitern. –

4

Meine Interpretation wäre: der Inhalt eines Vtable-Zeiger auf virtuelle Methoden.

Keine sehr gute Formulierung, IMHO.

1

Es könnte bedeutet auch, einen Funktionszeiger von/virtual eines Verfahrens Vater rein virtuelle erstellen und sie mit einem Kind nennen, ist es immer noch keine gute Formulierung ...

2

C++ Compiler erstellt eine versteckte Klasse Mitglied genannte virtuelle -pointer oder kurz vptr, wenn es eine oder mehrere virtuelle Funktionen gibt. Dieser vptr ist ein Zeiger, der auf eine Tabelle von Funktionszeigern zeigt. Diese Tabelle wird auch vom Compiler erstellt und als virtuelle Funktionstabelle oder Vtable bezeichnet. Jede Zeile der V-Tabelle ist ein Funktionszeiger, der auf eine entsprechende virtuelle Funktion zeigt.

Um späte Bindung zu erreichen, erstellt der Compiler diese vtable-Tabelle für jede Klasse, die virtuelle Funktionen enthält, und für die daraus abgeleitete Klasse. Der Compiler platziert die Adressen der virtuellen Funktionen für diese bestimmte Klasse in 'vtable'. Wenn der virtuelle Funktionsaufruf über einen Basisklassenzeiger erfolgt, fügt der Compiler ruhig Code ein, um den VPTR abzurufen und die Funktionsadresse in VTABLE nachzuschlagen, wodurch die richtige Funktion aufgerufen wird und eine späte/dynamische Bindung stattfindet .