[C++] question théorique

Voir le sujet précédent Voir le sujet suivant Aller en bas

[C++] question théorique

Message  trikman le Dim 11 Mar 2012, 00:46

Bonjour,

je crée ce topic un peu pour tout le monde en 2eme... , poster vos questions ici comme ca on centralise tout sur un meme sujet , c'est plus simple je trouve .

mon probleme : je n'arrive pas à répondre à la question "// Que se passe-t-il si le destructeur de Mammifere n'est pas virtual ?" citée dans le code ci-dessous . j'ai évidement testé en retirant le virtual dans le code de mammifere.h et je ne vois pas la difference.
En retirant le virtual , l'objet créé (imaginons a l adresse 0x12345) sera supprimé et c'est bien l'objet a l adresse 0x12345 qui est supprimé(rmq: la seul difference est que on ne supprime pas un cheval , mais un mammifere .mais quelle difference si l'objet supprimé est bien celui que l'on souhaite supprimer ...) . peut-etre vais-je dire une betise mais pour le moment j ai l'impression que (dans ce cas) mettre un virtual au destructeur ou non dans la classe mammifere ne change rien

ma 2eme question : pourquoi les objets créés ne sont-il pas dynamique ?


Code:
/*----------------------------------------------*/

   // Interdiction absolue de faire ce genre de chose :
   // delete menagerie.back();
   // menagerie.pop_back();
   // car les objets de menagerie ne sont PAS dynamiques !!

   /*----------------------------------------------*/

   // Pour voir ce qui se passe avec delete ...
   Mammifere * ma = new Cheval();
   cout << "\n" << ma->getIdentite() << " (" << ma->getCri() << ")\n" << endl;
   delete ma;
   // Que se passe-t-il si le destructeur de Mammifere n'est pas virtual ?

   /*----------------------------------------------*/

   cout << "\n***** C'en est fini de l'arche de NOÉ ! *****\n" << endl;

trikman

Nombre de messages : 68
Prénom : martin
Date d'inscription : 04/11/2009

Revenir en haut Aller en bas

Re: [C++] question théorique

Message  ayoub le Dim 11 Mar 2012, 01:27

Je pense que si tu omets de mettre le virtual, dans ce cas là le polymorphisme n'a pas lieu. Donc, au lieu de détruire un Cheval, tu détruiras des mammifères. Maintenant j'en suis réellement pas sûr, c'est qu'une hypothèse.

ayoub

Nombre de messages : 41
Age : 24
Prénom : Ayoub
Statut : Ancien Etudiant
Localisation : Saint-Gilles
Date d'inscription : 10/05/2011

Revenir en haut Aller en bas

Re: [C++] question théorique

Message  smb le Dim 11 Mar 2012, 09:28

ayoub a écrit:Je pense que si tu omets de mettre le virtual, dans ce cas là le polymorphisme n'a pas lieu. Donc, au lieu de détruire un Cheval, tu détruiras des mammifères. Maintenant j'en suis réellement pas sûr, c'est qu'une hypothèse.

Pas mal ayoub !


Sans virtual, le delete du pointeur ma

Code:
Mammifere * ma = new Cheval();
delete ma;

ne provoquera l'affichage que de

mort d'un mammifere

tandis qu'avec virtual devant le destructeur de mammifere,
l'affichage sera:

mort d'un cheval
mort d'un mammifere


Donc tout est détruit correctement !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

Re: [C++] question théorique

Message  trikman le Dim 11 Mar 2012, 16:50

tandis qu'avec virtual devant le destructeur de mammifere,
l'affichage sera:

mort d'un cheval
mort d'un mammifere

Donc tout est détruit correctement !

tout est detruits correctement ? ok , mais comment ? c'est ca que je ne comprend pas ...
j ai imaginé une hypothese (peut être une grosse bêtise lol) . je detruit le cheval donc je fait appel au destructeur de cheval , qui lui meme fait appel au destructeur de mammifère de manière implicite ? et la on vois la puissance du polymorphisme ...


trikman

Nombre de messages : 68
Prénom : martin
Date d'inscription : 04/11/2009

Revenir en haut Aller en bas

Re: [C++] question théorique

Message  smb le Dim 11 Mar 2012, 18:21

trikman a écrit:
tandis qu'avec virtual devant le destructeur de mammifere,
l'affichage sera:

mort d'un cheval
mort d'un mammifere

Donc tout est détruit correctement !

tout est detruits correctement ? ok , mais comment ? c'est ca que je ne comprend pas ...
j ai imaginé une hypothese (peut être une grosse bêtise lol) . je detruit le cheval donc je fait appel au destructeur de cheval , qui lui meme fait appel au destructeur de mammifère de manière implicite ? et la on vois la puissance du polymorphisme ...


Quand une instance d'une classe dérivée est détruite, ç-à-d, pour les instances
automatiques (interne à un bloc {}) : à la fin de ce bloc;
statiques : à la fin du programme;
dynamiques : au delete du pointeur.
C'est d'abord le destructeur de l'instance dérivée qui est appelé automatiquement et ensuite le destructeur de la classe mère.
Donc
Code:
Cheval * dada = new Cheval;
delete dada;
ou
Code:
{
Cheval jumper;
}
donneront comme affichage
mort d'un cheval
mort d'un mammifere


Par contre, dans le cas suivant :
Code:
Mammifere * unMammifere = new Cheval ;
delete unMammifere;
Pour obtenir le même affichage que dans les deux autres cas, il faut mettre virtual devant le destructeur de Mammifere pour faire jouer le polymorphisme et pour faire en sorte que lors d'un delete, c'est l'objet réel pointé par unMammifere qui est détruit !
Sans virtual, c'est uniquement le destructeur de Mammifere qui est invoqué.
Par défaut, C++ n'est pas polymorphe.


smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

Re: [C++] question théorique

Message  trikman le Lun 12 Mar 2012, 20:02

je vois un peu plus clair ...

merci pour cette explication :-)

Martin

trikman

Nombre de messages : 68
Prénom : martin
Date d'inscription : 04/11/2009

Revenir en haut Aller en bas

Re: [C++] question théorique

Message  Contenu sponsorisé Aujourd'hui à 14:29


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum