C ++ Zeiger Multi-Vererbung Spaß

8

Ich schreibe Code, der die Vererbung von einer grundlegenden ref-zählenden Pointer-Klasse betrifft; und einige Feinheiten von C ++ tauchte auf. Ich habe es wie folgt reduziert:

Angenommen, ich habe:

%Vor%

Darüber hinaus:

%Vor%

Danke!

    
anon 28.01.2010, 18:58
quelle

5 Antworten

7
  
  • 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.

    
sth 28.01.2010 19:07
quelle
2

C bettet ein A und ein B ein.

%Vor%

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.

    
Potatoswatter 28.01.2010 19:19
quelle
1
%Vor%

Nicht definiert, hängt von der Klassenstruktur ab.

%Vor%

Das ist in Ordnung.

%Vor%

Nein.

Zeigen sie auf gültige Objekte?

%Vor%     
George 28.01.2010 19:08
quelle
0

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.

    
Francis Boivin 28.01.2010 20:14
quelle
0

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:

%Vor%

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,

%Vor%

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%     
Nan Xiao 28.02.2017 08:48
quelle

Tags und Links