Garantien für die Adresse der Basisklasse in C ++?

8

In C-Struct ist das garantiert:

%Vor%

Nun, in C ++, wenn ich:

%Vor%

Wenn ja, können Sie mir eine Referenz geben (wie "Die C ++ Programmiersprache, Seite xyz")?

Danke!

    
anon 31.01.2010, 06:16
quelle

3 Antworten

10

Es gibt keine Garantie. Aus dem C ++ 03 Standard (10/3, class.ederived):

  

Die Reihenfolge, in der die Unterobjekte der Basisklasse im abgeleiteten Objekt (1.8) zugeordnet sind, ist nicht spezifiziert.

    
James McNellis 31.01.2010, 06:28
quelle
6

Auch wenn das Layout für Basisklassen nicht garantiert

%Vor%

Da der Cast einen static_cast (per 5.4) verwendet, der &bar korrekt konvertiert und der Vergleich zwischen pointer-to-base und pointer-to-derived ähnlich ist.

Dies wäre jedoch nicht garantiert:

%Vor%     
Roger Pate 31.01.2010 06:37
quelle
1

Ich kann mir nicht vorstellen, dass es so wäre, ich weiß nicht, warum es so sein müsste.

Ich habe eine verwandte Frage.

wenn Sie Diamantenvererbung haben:

%Vor%

lässt annehmen, dass die Speicherstruktur Base: A: B: Test,

ist

Hinweis zum Zeitpunkt des Aufrufs, der Compiler weiß, ist die Adresse des Anfanges des Objekts, und AFunc erwartet relativ zum Anfang des B-Objekts zu sein, diese beiden Adressen sind nicht die gleichen! Wie funktioniert es?

Wie wenn b vom Typ B wäre, wären die zwei Adressen gleich ...

    
matt 31.01.2010 06:33
quelle