Wichtige Änderungen in dynamic_cast

Aktualisiert: November 2007

In Microsoft Visual C++ 2005 sowie in Visual C++ .NET 2002 gab es Änderungen im dynamic_cast-Operator, sodass das Verhalten Ihrer Anwendung sich ändern kann.

  • Der Visual C++ 6.0-Compiler ließ eine Laufzeitüberprüfung zu, wenn eine Kompilierungszeitüberprüfung durch den Standard erforderlich war. Dies wurde in Visual C++ .NET 2002 (Visual C++ 7.0) korrigiert.

  • Die C-Laufzeitbibliothek führt nun eine dynamic_cast-Laufzeitüberprüfung durch, um sicherzustellen, dass der Typ des umgewandelten Ausdrucks zur Kompilierzeit auf ein öffentliches Basisklassen-Unterobjekt entweder vom umgewandelten Zieltyp (für Abwärtskonvertierung) oder vom am meisten abgeleiteten Objekttyp (für die übergreifende Konvertierung) verweist.

Weitere Informationen zu Compileränderungen finden Sie unter Wichtige Änderungen im Visual C++-Compiler.

Beschreibung

In diesem Codebeispiel ist die Variable pA2 in VC6 NULL; der Compiler hat nicht, wie in in 5.2.7/3 im C++-ISO-Standard eine Identitätsüberprüfung ausgeführt. Diese Umwandlung ist aber ab Visual C++ .NET 2002 (Visual C++ 7.0) erfolgreich.

Während dies also dazu führte, dass eine Ausnahme in Visual C++ 6.0 ausgelöst wurde, wird nun keine Ausnahme ausgelöst.

Code

// dynamic_cast_breaking_change.cpp
struct A { 
   virtual void F() {}
};

struct B { 
   virtual void F() {}
};

void Test(A* pA) {
   A* pA2 = dynamic_cast<A*>(pA);
   A& rA = dynamic_cast<A&>(*pA);
}

int main() {
   B* pB = new B;
   Test(reinterpret_cast<A*>(pB));
}

Beschreibung

Dieses Beispiel zeigt, dass die C-Laufzeitbibliothek nun eine dynamic_cast-Laufzeitüberprüfung durchführt, um sicherzustellen, dass der Typ des umgewandelten Ausdrucks zur Kompilierzeit auf ein öffentliches Basisklassen-Unterobjekt entweder vom umgewandelten Zieltyp (für Abwärtskonvertierung) oder vom am meisten abgeleiteten Objekttyp (für die übergreifende Konvertierung) verweist.

In vorherigen Visual C++-Versionen haben diese dynamischen Umwandlungen Erfolg gehabt.

Code

// dynamic_cast_breaking_change_2.cpp
#include "stdio.h"

struct A { 
   virtual void Test() {}
};

struct B : virtual private A {
   virtual void Test() {}
};

struct D : virtual private A {
   virtual void Test() {}
};

struct C : public B, public D {
   virtual void Test() {}
};

int main() {
   C c;
   printf("%p\n", dynamic_cast<B*>((A*)&c) );
   printf("%p\n", dynamic_cast<C*>((A*)&c) );
}

Beispielausgabe

00000000
00000000

Beschreibung

Dieses Beispiel zeigt, dass die dynamic_cast-Umwandlung fehlschlägt, wenn untergeordnete Objekte von der Quelle zum Ziel der Umwandlung nicht öffentlich sind.

Code

// dynamic_cast_breaking_change_3.cpp
#include "stdio.h"
struct A { 
   virtual void Test() {}
};

struct B : virtual public A {
   virtual void Test() {}
};

struct C : virtual private B {
   virtual void Test() {}
};

int main() {
   C c;
   printf("%p\n", dynamic_cast<B*>((A*)&c) );
   printf("%p\n", dynamic_cast<C*>((A*)&c) );
}

Beispielausgabe

0012FF70
00000000

Community-Beiträge

Anzeigen: