Alterações significativas no dynamic_cast
In Microsoft Visual C++ 2005 Assim sistema autônomo no Visual C++ .NET 2002, houve alterar no dynamic_cast operador, de modo que o comportamento do seu aplicativo pode ser alterado.
O compilador Visual C++ 6.0 permitido uma verificação em time de execução para ocorrer, quando uma verificação de time de compilar era necessária pelo padrão.Isso foi corrigido no Visual C++ .NET 2002 (Visual C++ 7.0).
A biblioteca C tempo de execução oferece agora um dynamic_cast verificação em time de execução para garantir o tipo de time de compilar da expressão que está sendo convertido refere-se a um sub-object pública classe base de um a projeção tipo de destino (para projeção de down) ou tipo de objeto derivado de mais (para projeção de cruzada).
Para obter mais informações sobre as alterações do compilador, consulte Alterações significativas no compilador Visual C++.
Exemplo
Descrição
Neste exemplo de código pA2 variável é nulo na VC6; o compilador não executou uma verificação de identidade sistema autônomo especificado no 5.2.7/3 no padrão ISO C++.No entanto, essa conversão será bem-sucedida início no Visual C++ .NET 2002 (Visual C++ 7.0).
Isso, embora isso causou uma exceção seja lançada no Visual C++ 6.0, nenhuma exceção em lançada agora.
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));
}
Exemplo
Descrição
Esse exemplo mostra que a biblioteca C tempo de execução oferece agora um dynamic_cast verificação em time de execução para garantir o tipo de time de compilar da expressão que está sendo convertido refere-se a um sub-object pública classe base de qualquer um o tipo de conversão de destino (para projeção de down) ou tipo de objeto derivado de mais (para projeção de cruzada).
Em versões anteriores do Visual C++, essas conversões dinâmicos bem-sucedida.
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) );
}
Saída de exemplo
00000000
00000000
Exemplo
Descrição
Mostra este exemplo que se qualquer sub-objects da fonte para o destino da conversão não são públicas, a dynamic_cast conversão falhará.
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) );
}
Saída de exemplo
0012FF70
00000000