static_cast objet fille pointeur

static_cast objet fille pointeur - C++ - Programmation

Marsh Posté le 28-04-2009 à 14:50:19    

Hi,
 

Code :
  1. struct A
  2. {
  3. void vA(){}
  4. };
  5. struct B:A
  6. {
  7. int n;
  8. void vB(){cout<<n;}
  9. };
  10. int main()
  11. {
  12. A * pA = new A;
  13. B * pB;
  14. pB = static_cast<B*>(pA);
  15. pB->n = 4;
  16. pB->vB(); //4
  17. system("pause" );
  18. }


 
C'est normal qu'un code comme ça compile et ne plante pas à l'éxécution? car à aucun moment on a appeler le constructeur de la classe B et pourtant le programme affecte un membre donné de cette classe et appel une méthode


Message édité par Glock 17Pro le 28-04-2009 à 15:00:48
Reply

Marsh Posté le 28-04-2009 à 14:50:19   

Reply

Marsh Posté le 28-04-2009 à 15:00:33    

en debug, y'a de bonnes chances que ca passe, ouais, tu vas juste écraser des données qui ne sont pas à toi. En release, y'a nettement moins de chance qu'on ne te jette pas ....


---------------
last.fm
Reply

Marsh Posté le 28-04-2009 à 15:07:45    

par contre un ptit delete pA à la fin du programme et ça plante à lexec :o

 

int main()
{
 B * pB=static_cast<B*>(new A);  
 pB->n =4;
 pB->vB();

 

delete ((A*)pB);

 

system("pause" );
}


Message édité par Glock 17Pro le 28-04-2009 à 15:10:17
Reply

Marsh Posté le 28-04-2009 à 15:16:48    

ouais, parce que tu as écrasé les infos de debug :)


---------------
last.fm
Reply

Marsh Posté le 28-04-2009 à 15:32:25    

tiens d'ailleurs ça fait un parfait exemple concernant les excpetions, comment cela se fait t-il que lorsque je try catch le delete ça plante tout de même ??

 

try
 {
  delete ((A*)pB);
 }
 catch(std::runtime_error& z)
 {
 cout << z.what();
 }

 

plante salement


Message édité par Glock 17Pro le 28-04-2009 à 15:33:55
Reply

Marsh Posté le 28-04-2009 à 15:34:54    

catch( ... )


---------------
last.fm
Reply

Marsh Posté le 28-04-2009 à 15:37:54    

no idem :(

Reply

Marsh Posté le 28-04-2009 à 15:39:42    

je ne suis pas tout à fait sur que ce soit catchable, comme problème (enfin, sur tout compilo) ... J'ai pas trop le temps de vérifier ce que dit le Stroustrup immédiatement ...
 
Edit : un bref détour par le chapitre 14.10 semble indiquer que delete ne retourne pas d'exception standard. à confirmer.


Message édité par theshockwave le 28-04-2009 à 15:44:58

---------------
last.fm
Reply

Marsh Posté le 28-04-2009 à 16:59:07    

pas de static_cast mais dynamic_cast pour un ce genre de conversion Base* -> Derivé*
 
La syntaxe (X*) est à bannir.
 
Tu peux catcher ce que tu veux avec ton delete, ça te feras une corruption de tas et puis c'est tout.

Reply

Marsh Posté le 28-04-2009 à 17:29:41    

Taz a écrit :

pas de static_cast mais dynamic_cast pour un ce genre de conversion Base* -> Derivé*


 
Je ne vois pas trop pourquoi tu veux interdire un static cast de ce genre ? Ca me semble tout à fait légal (qui plus est, les RTTI sont pas forcément activés chez tout le monde)


---------------
last.fm
Reply

Marsh Posté le 28-04-2009 à 17:29:41   

Reply

Marsh Posté le 29-04-2009 à 00:11:05    

c'est légal mais casse gueule. J'attends pas de quelqu'un qui fait du (A*) qu'il fasse bien la différence quand c'est OK ou pas.

Reply

Marsh Posté le 29-04-2009 à 00:41:51    

Taz a écrit :

pas de static_cast mais dynamic_cast pour un ce genre de conversion Base* -> Derivé*

 

oui mais j'ai pas forcément de fonction virtual dans ma classe A, et de ce fait je suis pas sûr qu'un dynamic_cast soit ok justement


Message édité par Glock 17Pro le 29-04-2009 à 00:46:08
Reply

Marsh Posté le 29-04-2009 à 09:30:05    

dynamic_cast fonctionnera bien que ta classe aie des méthodes virtuelles ou non.
 
Et pense bien à tester le retour de dynamic_cast, vu que ca peut te retourner un pointeur nul si jamais ton objet n'est pas du type dans lequel tu le castes.


---------------
last.fm
Reply

Marsh Posté le 29-04-2009 à 12:14:58    

en tout cas sous visual 2008 ça marche pas
  error C2683: 'dynamic_cast' : 'A' n'est pas un type polymorphe

Reply

Marsh Posté le 29-04-2009 à 12:27:10    

Glock 17Pro a écrit :

en tout cas sous visual 2008 ça marche pas
  error C2683: 'dynamic_cast' : 'A' n'est pas un type polymorphe


 
"Stroustrup approved", effectivement, on ne peut pas faire de dynamic_cast de ce genre, d'après le standard :) cela dit, c'est un peu risqué d'utiliser des interfaces sur des objets non polymorphiques (ne serait-ce que pour une question de destruction de l'objet)


---------------
last.fm
Reply

Marsh Posté le 29-04-2009 à 13:02:03    

D'autant plus que dans mon cas le dynamic_cast renverrait toujours NULL, donc seul le recours à static_cast permet d'avoir un pointeur 'partiellement' utilisable, partiellement car effectivement je devrais m'interdir l'accés aux méthodes et attribus de B

Reply

Marsh Posté le 29-04-2009 à 13:56:41    

reste que c'est quelque chose à proscrire. (et dans le cas d'un objet polymorphique, tu aurais ta stack qui exploserait potentiellement à n'importequel appel de méthode virtuelle)


---------------
last.fm
Reply

Marsh Posté le 29-04-2009 à 14:01:07    

yes effectivement

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed