Ich stimme der Antwort von @ j6t zu, aber hier ist eine erweiterte Argumentation mit Standardreferenzen.
Das spezielle Verhalten von dynamic_cast
Objekten, die sich im Bau und in der Zerstörung befinden, wird in [class.cdtor] / 5 des C ++ 17-Standards (endgültiger Entwurf) und in früheren Standardversionen beschrieben.
Insbesondere heißt es:
Wenn a dynamic_cast
[...] in einem Destruktor verwendet wird, [...] wenn sich der Operand von dynamic_cast
auf das im Aufbau oder in der Zerstörung befindliche Objekt bezieht, wird dieses Objekt als das am meisten abgeleitete Objekt mit dem Typ [ ...] Zerstörerklasse. Wenn der Operand von dynamic_cast
auf das Objekt unter [...] Zerstörung verweist und der statische Typ des Operanden kein Zeiger oder Objekt auf die eigene Klasse des [...] Destruktors oder eine seiner Basen ist, führt der dynamic_cast zu undefiniertes Verhalten.
Das undefinierte Verhalten gilt hier nicht, da der Operand der Ausdruck ist this
, der trivial den Typ eines Zeigers auf die eigene Klasse des Destruktors hat, da er im Destruktor selbst erscheint.
Der erste Satz besagt jedoch, dass sich der dynamic_cast
Wille so verhält, als wäre er *this
ein am meisten abgeleitetes Objekt vom Typ, Base2
und daher kann die Umwandlung in Base1
niemals erfolgreich sein, da er Base2
nicht von abgeleitet Base1
ist und dynamic_cast<Base1*>(this)
immer einen Nullzeiger zurückgibt, was zu dem angezeigten Verhalten führt.
cppreference.com gibt an, dass das undefinierte Verhalten auftritt , wenn der Zieltyp der Umwandlung nicht der Typ der Destruktorklasse oder eine ihrer Basen ist, anstatt dies auf den Operandentyp anzuwenden. Ich denke das ist nur ein Fehler. Wahrscheinlich sollte die Erwähnung von " neuem Typ " in Punkt 6 " Ausdruck " sagen , was dazu führen würde, dass es meiner obigen Interpretation entspricht.