Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
579 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  static_cast objet fille pointeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

static_cast objet fille pointeur

n°1878800
Glock 17Pr​o
Posté le 28-04-2009 à 14:50:19  profilanswer
 

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
mood
Publicité
Posté le 28-04-2009 à 14:50:19  profilanswer
 

n°1878809
theshockwa​ve
I work at a firm named Koslow
Posté le 28-04-2009 à 15:00:33  profilanswer
 

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
n°1878816
Glock 17Pr​o
Posté le 28-04-2009 à 15:07:45  profilanswer
 

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
n°1878825
theshockwa​ve
I work at a firm named Koslow
Posté le 28-04-2009 à 15:16:48  profilanswer
 

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


---------------
last.fm
n°1878842
Glock 17Pr​o
Posté le 28-04-2009 à 15:32:25  profilanswer
 

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
n°1878847
theshockwa​ve
I work at a firm named Koslow
Posté le 28-04-2009 à 15:34:54  profilanswer
 

catch( ... )


---------------
last.fm
n°1878848
Glock 17Pr​o
Posté le 28-04-2009 à 15:37:54  profilanswer
 

no idem :(

n°1878849
theshockwa​ve
I work at a firm named Koslow
Posté le 28-04-2009 à 15:39:42  profilanswer
 

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
n°1878916
Taz
bisounours-codeur
Posté le 28-04-2009 à 16:59:07  profilanswer
 

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.

n°1878935
theshockwa​ve
I work at a firm named Koslow
Posté le 28-04-2009 à 17:29:41  profilanswer
 

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
mood
Publicité
Posté le 28-04-2009 à 17:29:41  profilanswer
 

n°1879031
Taz
bisounours-codeur
Posté le 29-04-2009 à 00:11:05  profilanswer
 

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.

n°1879038
Glock 17Pr​o
Posté le 29-04-2009 à 00:41:51  profilanswer
 

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
n°1879065
theshockwa​ve
I work at a firm named Koslow
Posté le 29-04-2009 à 09:30:05  profilanswer
 

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
n°1879190
Glock 17Pr​o
Posté le 29-04-2009 à 12:14:58  profilanswer
 

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

n°1879196
theshockwa​ve
I work at a firm named Koslow
Posté le 29-04-2009 à 12:27:10  profilanswer
 

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
n°1879220
Glock 17Pr​o
Posté le 29-04-2009 à 13:02:03  profilanswer
 

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

n°1879265
theshockwa​ve
I work at a firm named Koslow
Posté le 29-04-2009 à 13:56:41  profilanswer
 

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
n°1879267
Glock 17Pr​o
Posté le 29-04-2009 à 14:01:07  profilanswer
 

yes effectivement


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  static_cast objet fille pointeur

 

Sujets relatifs
[C++] Utiliser le pointeur this dans le constructeurPOO, objet rempli mais rien quand je l'affiche
[debutant] programmation objet et formulaire.pointeur et fonction langage C
exercice pointeur et fonction langage Cexercice pointeur et fonction langage C
Différence entre pointeur et tableau, allocation dynamique et statiquetable relationnelles, vues objet et héritage
[Java] Probleme de castPositionnement objet et image de fond
Plus de sujets relatifs à : static_cast objet fille pointeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR