- zeigt po auf ein gültiges A-Objekt?
- verweist pb auf ein gültiges B-Objekt?
Ja, das C*
wird konvertiert, sodass pa
und pb
auf die richtigen Adressen zeigen.
- funktioniert pa == pb?
Nein, normalerweise nicht. Es darf kein A
-Objekt und kein B
-Objekt an derselben Adresse geben.
Darüber hinaus
- pc == (C *) pa?
- pc == (C *) pb?
Der Cast wandelt die Zeiger zurück in die Adresse des C
-Objekts, so dass beide Gleichheiten wahr sind.
C
bettet ein A
und ein B
ein.
ist dem C-Code sehr ähnlich
%Vor% und (B*) &c;
entspricht static_cast< B* >( &c )
ist ähnlich wie &c.self_b
, wenn Sie gerade C verwenden.
Im Allgemeinen können Sie sich nicht darauf verlassen, dass Zeiger auf verschiedene Typen austauschbar oder vergleichbar sind.
Was Sie bekommen, ist so etwas in Erinnerung
%Vor%Wenn Sie also das gesamte C-Objekt haben wollen, erhalten Sie einen Zeiger auf den Anfang des Speichers. Wenn Sie nur das A "Teil" möchten, erhalten Sie dieselbe Adresse, da sich dort die Datenelemente befinden. Wenn Sie das B "part" möchten, erhalten Sie den Anfang + sizeof (A) + sizeof (was auch immer der Compiler für vtable hinzufügt). Also im Beispiel pc! = Pb (könnte pc! = Pa sein), aber pa ist nie gleich pb.
Punkt 28 Bedeutung des Zeigervergleichs in C ++ - allgemeines Wissen: Wesentliche Zwischenprogrammierung ) erklärt den Schlüssel des Objektzeigers in C ++:
In C ++ kann ein Objekt mehrere gültige Adressen haben, und der Zeigervergleich ist keine Frage über Adressen. Es ist eine Frage zur Objektidentität.
Sehen Sie sich den Code an:
%Vor% class C
stammt sowohl von class A
als auch von class B
, also ist class C
sowohl class A
als auch class B
. Das Objekt C c
hat 3 gültige Adressen: Adresse für class A
, class B
und class C
. Die Implementierung hängt vom Compiler ab, daher können Sie das Speicherlayout von class C
nicht annehmen, und es könnte so aussehen:
Obwohl der Adresswert von pc
, pa
und pb
im obigen Fall nicht identisch ist, beziehen sich alle auf dasselbe Objekt ( c
). Daher muss der Compiler sicherstellen, dass pc
vergleicht gleich pa
und pb
, dh pc == pa
und pc == pb
. Der Compiler führt diesen Vergleich durch, indem er den Wert eines der Zeiger, die durch den geeigneten Offset verglichen werden, einstellt. Zum Beispiel,
wird übersetzt in:
%Vor% Da A
und B
unter anderem keine Vererbungsbeziehung haben, können wir pa
und pb
nicht direkt vergleichen.
Für Ihre Fragen:
%Vor%Tags und Links c++ multiple-inheritance