Ich experimentiere mit C ++, um zu verstehen, wie Klassen / Strukturen und ihre jeweiligen Objekte im Speicher angeordnet sind, und ich habe verstanden, dass jedes Feld einer Klasse / Struktur ein Offset in ihr jeweiliges Objekt ist (also kann ich eine Elementvariable haben) Zeiger).
Ich verstehe nicht warum, auch wenn ich Memberfunktionszeiger haben kann, funktioniert folgender Code nicht:
%Vor%Meine Frage ist: Warum funktioniert die Zeile
? %Vor%compile und gibt mir den Offset des "c" -Feldes vom Anfang der Struktur und der Zeile
zurück %Vor%kompiliert nicht sogar?
Elementfunktionen oder Zeiger auf sie sind nicht im Objekt gespeichert. ( virtual
-Funktionen werden normalerweise über einen Zeiger aufgerufen, der in einer Tabelle gespeichert ist, auf die ein Objekt einen einzigen Zeiger hat). Dies wäre eine große Speicherverschwendung. Sie werden typischerweise in einem Code-Speicherabschnitt gespeichert und sind dem Compiler bekannt. Das Objekt ( *this
) wird normalerweise als unsichtbarer -Parameter übergeben, damit die Funktionen wissen, welches Objekt beim Aufruf aufgerufen werden soll.
Also, in der Laiensprache hättest du
%Vor%und
%Vor% Dabei ist a
das Objekt, für das Sie foo
aufrufen.
Mitgliedsfunktionszeiger werden in der Praxis nicht in Objekten gespeichert: Es besteht keine Notwendigkeit. Der C ++ - Standard spezifiziert nicht genau, wie z. Virtuelle Funktionen sollen implementiert werden, aber die übliche Praxis für virtuelle Elementfunktionen ist, dass jedes Objekt einen Zeiger auf eine Tabelle von Funktionszeigern enthält; Dieser Zeiger wird als vtable Zeiger bezeichnet.
Sie könnten versuchen, "Inside das C ++ Objektmodell " von Stanley Lippman.
Oder Sie versuchen einfach, mein altes Tipps-Lernprogramm zu erhalten , die einmal aus dem Wikipedia-Artikel zitiert wurde, bevor meine damalige Homepage verschwand.
In Bezug auf die zweite Frage, warum die Adresse von p->memberFunc
den Compiler ein wenig ersticken lässt, hat dieser Ausdruck keinen Typ, es ist nur eine syntaktische Entität , auf die Sie eine Argumentliste anwenden können um die Funktion aufzurufen.
Um es zu sagen,
%Vor%Zusammenstellung:
%Vor%Tags und Links memory c++ function-pointers pointer-to-member