2010-03-18 2 views
11

Est-ce que static_cast (Pointeur de base) doit donner une erreur de compilation?Est-ce que static_cast <Derived *> (pointeur de base) doit donner une erreur de compilation?

class A 
{ 
public: 
    A() 
    { 

    } 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
    } 
}; 

int main() 
{ 
    A *a=new A(); 
    B * b=static_cast<B*>(a); // Compile Error? 
} 
+0

Utilisez le bouton '010' ou le retrait de 4 espaces pour le balisage de code. –

+0

@sandeep, les instructions 'cout <<' de ces constructeurs sont-elles prévues? Pour autant que je vois, ils sont sans rapport avec la question, et seraient mieux enlevés. –

+1

Il convient de noter que, même si cet extrait de code va bien se compiler, il aura un comportement ** indéfini **. Vous faites la promesse au compilateur que 'a' pointe vers un objet B, et que vous mentez à votre compilateur. Les démons nasaux sont en route. –

Répondre

11

Il ne donne pas une erreur de compilation parce que le casting pourrait très bien être valide, et vous souvent le faire dans la pratique, par exemple:

A* a = new B; 
B* b = static_cast<B*>(a); // OK 

Dans votre code, dans la mesure comme le compilateur est concerné, vous faites la même chose. Il ne peut pas savoir que le casting serait invalide, donc il le permet au moment de la compilation. Au moment de l'exécution, cependant, vous allez obtenir quelques erreurs désagréables dès que vous essayez d'utiliser une fonctionnalité de B sur une instance de A.

14

Il ne peut pas donner erreur de compilation de temps en raison d'une relation de base dérivées peut exister à l'exécution en fonction de l'adresse des pointeurs étant casted. static_cast réussit toujours, mais déclenchera undefined-behavior si vous ne lancez pas le bon type. dynamic_cast peut échouer ou non, en vous disant si vous avez essayé de lancer le bon type ou non.

Donc, à mon avis, static_cast devrait être utilisé pour abaissé seulement si le design peut établir qu'une telle possibilité existe. Un bon exemple de ceci est CRTP. C'est donc logique dans certaines situations mais essayez de l'éviter car c'est un comportement non défini.

RTTI est pas nécessaire pour static_cast qui pourrait le rendre plus rapide théoriquement, mais je Commercera en tout temps un dynamic_cast contre le comportement non défini qui static_cast peut causer!

+0

Que voulez-vous dire par "dynamic_cast peut échouer ou non"? Voulez-vous dire qu'il y a une incertitude sur le fait que dynamic_cast échouera dans l'exemple ci-dessus? Ou voulez-vous dire qu'il échouera toujours? – ibizaman

+0

@ibizaman: Il n'y a pas d'incertitude ici. Enfait, il vous dira quand il a échoué et quand il n'a pas échoué. Je pense que si vous lisez la phrase complète, cela devrait avoir du sens. – Abhay

+0

en effet, c'était juste pour être sûr :) – ibizaman

Questions connexes