2016-01-25 2 views
5

Angenommen, ich habe:Sollte ich erwarten, dass Upcasts und Downcasts bei der einzelnen Vererbung den Zeiger nicht anpassen?

class Base { 
public: 
    virtual void Nothing() {} 
}; 
class MiddleDerived : public Base { 
    virtual void Nothing() {} 
}; 
class Derived : public MiddleDerived { 
    virtual void Nothing() {} 
}; 

und mein Code sieht wie folgt aus:

Derived* object = new Derived(); 
Base* base = object; //implicit conversion here 

void* derivedVoid = object; 
void* baseVoid = base; 

Sollte ich erwarten, dass baseVoid == derivedVoid?

Ich weiß, dass die meisten Implementierungen auf diese Weise arbeiten, aber ist es garantiert?

+0

Überlegen Sie, "Sprachanwalt" für "Portabilität" zu ersetzen? – Bathsheba

+0

Während Sie die Frage (und nicht das Beispiel) formuliert haben, haben Sie die Möglichkeit offen gelassen, dass die Basisklasse keine virtuellen Methoden hat (während einige abgeleitete Klassen dies tun). Das könnte noch "Single-Vererbung" sein, aber die Zeiger wären ** nicht ** gleich. Für Ihr ** Beispiel ** bin ich kein gut genug Sprachanwalt, um meine Überzeugung zu bestätigen, dass es nur in der üblichen Praxis wahr ist, nicht vom Standard versprochen. – JSF

+0

Ich denke, das sollte funktionieren, aber ich glaube nicht, dass es ein Standard-Layout für Nicht-POD-Klassen gibt. – NathanOliver

Antwort

2

Was Sie erwarten können, kann sich von dem unterscheiden, was garantiert ist.

Ein static_cast nach oben oder unten eine Vererbungskette kann die Adresse ändern. Das kanonische Beispiel, wo dies in der Praxis vorkommt, ist, wo eine Basisklasse nicht-polymorph ist und eine abgeleitete Klasse eine virtuelle Funktion einführt, die dann bei vielen Compilern einen vtable-Zeiger am Anfang jedes abgeleiteten Objekts einführt.

2

ich glaube, das Teil des Standard, der mit dieser befasst ist §5.2.9 (13)

Welche (in aller Kürze) besagt, dass eine T * Umwandlung in einem void * und dann auf einen T zurück * soll sich auf das gleiche Objekt beziehen. Die Adresse Derived muss mit der Adresse Base identisch sein.

Also meine Antwort wäre, "Nein - Code, der diese Äquivalenz erwartet ist schlecht gebildet Einladung undefined Verhalten".

Verwandte Themen