Je vérifiais le comportement de dynamic_cast et j'ai trouvé qu'en cas d'échec, l'exception std :: bad_cast n'est levée que si la destination est un type de référence. Si la destination est un type de pointeur, aucune exception n'est générée par la distribution. Voici mon exemple de code:Différence de comportement lors de l'utilisation de dynamic_cast avec référence et pointeurs
class A
{
public:
virtual ~A()
{
}
};
class B : public A
{
};
int main()
{
A* p = new A;
//Using reference
try
{
B& b = dynamic_cast<B&>(*p);
}
catch(std::bad_cast exp)
{
std::cout<<"Caught bad cast\n";
}
//Using pointer
try
{
B* pB = dynamic_cast<B*>(p);
if(pB == NULL)
{
std::cout<<"NULL Pointer\n";
}
}
catch(std::bad_cast exp)
{
std::cout<<"Caught bad cast\n";
}
return 0;
}
La sortie est "Caught Bad Cast" et "Pointeur NULL". Le code est compilé en utilisant VS2008. Est-ce le bon comportement? Si oui, alors pourquoi y a-t-il une différence?
Mais pourquoi l'exception ne peut-elle pas être levée en cas de pointeurs? – Naveen
Vous devrez alors essayer de récupérer chaque dynamic_cast qui est du code corrompu. Au lieu de cela, vous pouvez prendre l'adresse, dynamic_cast et vérifier null. – sharptooth
En outre, jeter et attraper des exceptions est relativement coûteux, et je soupçonne que les concepteurs voulaient trouver un moyen de minimiser ce coût. –