2017-01-10 1 views
0
struct Base { 
    int i, j; 
}; 

struct Derived : Base {}; 

Mit obigem Szenario, wenn wir folgenden:Abgeleitete Klasse hat keine zusätzlichen Datenelemente; Ist es sicher, ein Basisobjekt statisch auf ein abgeleitetes Objekt zu reduzieren?

Base b; 
auto& d = static_cast<Derived&>(b); 
d.i = 1; 

Wird es ein undefiniertes Verhalten sein?

Hinweis: Aus irgendwelchen Gründen kann ich den Code eines Autos nicht bearbeiten erzeugt protobuf Bibliothek Google. Daher erweitern diese Klassen zu meiner benutzerdefinierten Klasse, die mehr Typen & APIs bereitstellt, aber es hat kein zusätzliches Datenelement.

+0

@pSoLT, danke. [Downcasting mit dem Static_cast in C++] (http://stackoverflow.com/q/6322949/514235). Es ist stark verwandt. In diesem Qn werde ich mehr interessiert zu wissen, wenn die Größen möglicherweise gleich sind. Übrigens, wenn jemand das Gefühl hat, dass die akzeptierte Antwort in diesem Post auch dieses Qn bewirtet, dann wird es großartig sein, wenn jemand in leichterer Sprache erklären kann. Ich habe mich gerade verloren, als ich diese Passage aus dem Standard gelesen habe. :-) – iammilind

Antwort

2

Ja, dies ist ein undefiniertes Verhalten. Die Verwendung von static_cast zum Umwandeln von einer Basisklasse in einen abgeleiteten Typ, bei dem es sich bei dem Objekt nicht um eine Instanz handelt, ist ein nicht definiertes Verhalten.

Zusätzlich Sie die strenge Aliasing Regel brechen, indem ein Objekt durch eine Variable eines ungültigen Typ Zugriff (nicht der dynamische Typ, eine Basisklasse des dynamischen Typ, char oder unsigned char Typ, und ein paar andere Fälle).

+0

Ich denke das Praktische sollte auch beachtet werden. Ich kann mir keinen Compiler vorstellen, der den Downcast erkennt und schädliche Dinge tut. Ein Beispiel für ein derartiges Verhalten wäre sehr zu begrüßen. –

+1

@ Cheersandhth.-Alf: Ob sich heute Compiler-Writer auf seltsame Weise verhalten oder nicht, ist für Compiler in Mode, zu versuchen, Fälle zu identifizieren, in denen bestimmte Eingaben Undefined Behavior verursachen und dann bedingte Tests eliminieren, die immer den gleichen Wert liefern in allen anderen Fällen. Ich bin skeptisch, dass solche "Optimierungen" ein Kosten-Nutzen-Verhältnis bieten würden, das annähernd so gut ist wie das, was man mit Compiler-Anweisungen erreichen könnte, um bestimmte Annahmen über Eingabewerte zu treffen, aber ich kontrolliere die Moden nicht. – supercat

Verwandte Themen