#include <iostream>
using namespace std;
class X{
public:
virtual void f(){}
};
class Y {
public:
virtual void g() {}
};
int main()
{
X * x = new X();
Y* y = dynamic_cast<Y*>(x); //A
// Y* y = static_cast<Y*>(x); //B
cout << y << endl;
}
A compiles whereas B doesn't. I understand why B doesn't get compiled but why does A get compiled although X and Y are completely unrelated types?
7 Réponses :
compilateur s'en fiche, car il est dynamic_cast code>. y code> sera null code> après la distribution. p>
La distribution dynamique utilise les informations de type d'exécution. C'est donc légal faire ce cas mais il retournera un pointeur nul. La distribution statique est évaluée par le compilateur. P>
Je vous suggère de Lisez sur C ++ Type Casts. P> dynamic_cast code> exécute le type de vérification de l'exécution, à l'aide de RTTI, tandis que static_cast code> fonctionne au moment de la compilation. Alors, que vous obtiendriez si vous avez couru a code> serait y == null code>. P>
Cast dynamique retourne null s'il ne peut pas terminer la distribution: p>
http://www.cplusplus.com/doc/tatutorial/typecasting/ p>
et rechercher dynamic_cast p>
Si [en utilisant Dynamic Cast], vous essayez de lancer sur un type de pointeur et que le type n'est pas un type réel de l'objet d'argument, le résultat de la distribution sera
C'est pourquoi dynamic_cast code> est autorisé entre types non liés:
Il y a une différence énorme entre A Le compilateur peut déterminer si cela est légal ou non, car avoir la définition de pour les hiérarchies non triviales: p> Cela donnerait une erreur: le compilateur ne saurait pas à partir de quelle base (celle de ou si vous avez utilisé Le compilateur aurait besoin d'informations d'exécution et la compilation échouerait donc aussi. p> A couler en fonction du type de temps d'exécution véritable: P > static_cast code> et dynamic_cast code>, je vais simplement réduire la discussion au monde des objets. static_cast code > Peut être utilisé pour le casting (infâme). C'est-à-dire: p> dérivée code> it sait forte > si dérivé code> est en fait une descendante de base code>. p> d1 code> ou celle de d2 code> vous êtes venu de). / p> virtuel code> héritage: p> dynamic_cast code> est cependant beaucoup plus intelligent, bien que cela arrive au coût des frais généraux d'exécution. Le compilateur génère des informations sur les objets connus comme RTTI (informations de type d'exécution), que le dynamic_cast code> explorera pour permettre: p> void foobar(X* x)
{
void* xAddr = dynamic_cast<void*>(x);
Y* y = dynamic_cast<Y*>(y);
void* yAddr = dynamic_cast<void*>(y);
Z* z = dynamic_cast<Z*>(x);
void* zAddr = dynamic_cast<void*>(z);
if (z) { assert(xAddr == yAddr && xAddr == zAddr); }
}