Compartir a través de


Cambios importantes en dynamic_cast

Actualización: noviembre 2007

En Microsoft Visual C++ 2005, así como en Visual C++ .NET 2002, se hicieron cambios en el operador dynamic_cast, de modo que el comportamiento de su aplicación puede cambiar.

  • El compilador de Visual C++ 6.0 permitía comprobaciones en tiempo de ejecución, mientras que el estándar requería comprobaciones en tiempo de compilación. Esto se corrigió en Visual C++ .NET 2002 (Visual C++ 7.0).

  • La biblioteca de tiempo de ejecución de C hace ahora una comprobación en tiempo de ejecución dynamic_cast para asegurarse de que el tipo de tiempo de compilación de la expresión que se está convirtiendo hace referencia a un subobjeto de clase base pública del tipo de destino de la conversión (para conversión hacia abajo) o del tipo de objeto más derivado (para conversión cruzada).

Para obtener más información sobre cambios del compilador, vea Cambios importantes en el compilador de Visual C++.

Ejemplo

Descripción

En este ejemplo de código, la variable pA2 es NULL en VC6; el compilador no realizó una comprobación de identidad como se especificaba en 5.2.7/3 en el estándar ISO C++. Sin embargo, esta conversión de tipos se realizará satisfactoriamente en Visual C++ .NET 2002 (Visual C++ 7.0).

Así, mientras esto producía una excepción en Visual C++ 6.0, ahora ya no se produce ninguna excepción.

Código

// 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));
}

Ejemplo

Descripción

Este ejemplo muestra que la biblioteca de tiempo de ejecución de C hace ahora una comprobación en tiempo de ejecución dynamic_cast para asegurarse de que el tipo de tiempo de compilación de la expresión que se está convirtiendo hace referencia a un subobjeto de clase base pública del tipo de destino de la conversión (para conversión hacia abajo) o del tipo de objeto más derivado (para conversión cruzada).

En versiones anteriores de Visual C++, estas conversión de tipos dinámicas se realizaban satisfactoriamente.

Código

// 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) );
}

Resultados del ejemplo

00000000
00000000

Ejemplo

Descripción

Este ejemplo muestra que si cualquier subobjeto del origen al destino de la conversión de tipos no es público, se producirá un error en la conversión dynamic_cast.

Código

// 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) );
}

Resultados del ejemplo

0012FF70
00000000

Vea también

Referencia

dynamic_cast Operator