Ich habe zwei Fragen zu C ++:
In vielen Lehrbüchern ist das Schlüsselwort this
ein Zeiger auf das aufrufende Objekt . Richtig?
Da ich gerne mit Codierung spiele, habe ich den folgenden einfachen Code geschrieben:
%Vor%Der obige Code erzeugt die folgende Ausgabe:
%Vor% Wenn this
auf das aufrufende Objekt zeigt, sollte die zweite Zeile von sizeof(*this)
8 anstatt 4 ausgeben, da das aufrufende Objekt b
ist? Was passiert hier eigentlich? Wurde this
herabgestuft? !!!!
Wenn this
zurückgestuft wurde, um Base
einzugeben, wie ruft this->f()
die korrekte Funktion auf? Ich bin wirklich verwirrt.
Die wichtige Unterscheidung, die getroffen werden muss, ist, dass sizeof
ein Kompilierzeit -Operator ist, kein Laufzeitoperator . Der Compiler interpretiert den Ausdruck sizeof(*this)
als "die Größe des Objekts, auf das this
zeigt", was im Bereich von Base::g
ein Objekt vom Typ Base
wäre. Der Compiler wird diese Anweisung im Wesentlichen wie folgt neu schreiben, weil er weiß, dass die Größe von Base
vier Bytes ist:
Base
kann nichts, was Teil von abgeleiteten Objekten ist, nicht sehen / darauf zugreifen / wissen, also meldet sizeof
nur den Teil des Objekts, der für sie sichtbar ist. Genauer gesagt, sizeof
in einer Methode von Base
kann nicht wissen, dass es Unterklassen gibt oder geben wird (Sie können Base
ableiten, ohne sie neu zu kompilieren), so dass sie nur den Teil weiß es. ( sizeof
wird zur Kompilierzeit berechnet, nicht zur Laufzeit.)
Die korrekte Funktion f
wird aufgerufen, weil Base::f
virtuell ist. Dies teilt dem Compiler mit, dass, wenn ein Aufruf von Base*->f()
angefordert wird, die tatsächliche Adresse des Aufrufers in der vtable des tatsächlichen Objekts nachgeschlagen wird, dessen Member Sie aufrufen.
Der Typ der this
ist Base*
, weshalb sizeof(*this) == sizeof(Base)
, aber seine vtable gehört zu einem abgeleiteten Objekt und daher der Funktionsaufruf an f
die Überschreibung.
this
ist ein Konstantwertzeiger auf das Objekt, für das die Funktion ein nicht statisches Element ist. Dies bedeutet, dass this
nur in nicht statischen Membern einer Klasse verwendet werden kann, um ein brauchbarer Wert zu sein. Denken Sie daran: Sie müssen eine Objektinstanz verwenden, um eine nicht statische Elementfunktion aufzurufen (instance.function oder instance- & gt; -Funktion). this
ist ein Zeiger auf "Instanz".
Der Grund, warum die Größe nie die 8 ist, die Sie erwarten, ist, weil g
ein Mitglied der Klasse Base
ist. Für g
ist this
vom Typ Base *const
und daher ist *this
vom Typ Base&
. Das sizeof(Base)
ist 4. Auch wenn es ein virtuelles Mitglied wäre, würde sich dies nicht ändern; Der Typ für diese Implementierung von g
wäre immer Base *const
. Praktisch überschriebene Versionen würden unterschiedliche Typen haben, aber nur den Typ der Klasse, die sie implementiert.
this
folgt nicht dem Polymorphismus; es hat genau und nur den Typ, mit dem die Funktion definiert wurde.
Tags und Links c++