IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut L'existence d'une méthode virtual dans ma classe implique t-elle que le destructeur doit etre aussi virtual !?
    bonsoir,
    j'ai trouvé dans un cours la règle suivante :

    l'existence d'une méthode virtual dans une classe implique qu'il est fortement recommandé de déclarer son destructeur virtuel.
    qui peut m'expliquer cette obligation ?

    ( est ce parcque la déclaration d'une fonction membre comme virtual dand une classe explique qu'il y aura une classe qui va dériver de cette classe et donc pour pouvoir détruire un objet de la classe fille il faut que le destructeur de sa classe mère soit virtal )?

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Oui, c'est ça.

    Mais un petit peu de recherche préalable serait sympa... Par exemple, de nombreux éléments de réponse sont définis là : http://cpp.developpez.com/faq/cpp/?p...ucteur-virtuel (ou alors dans de nombreux livres sur le C++).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Seulement s'il est censé être possible de détruire l'objet via un pointeur du type de la classe mère.
    Sinon, le destructeur peut être protégé non-virtuel à la place, et il permettra toujours ceci:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
    	Derivee obj;
    	FonctionQuiPrendPointeurBase(&obj); //La fonction ne peut pas faire de delete dessus
    	return 0;
    }//L'objet est détruit correctement
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 624
    Points : 30 667
    Points
    30 667
    Par défaut
    Salut,

    Toute l'astuce réside dans les termes fortement recommandé ...

    De manière générale, la présence d'une fonction virtuelle implique que tu es face à une classe ayant sémantique d'entité ou, si tu préfères, d'une classe intervenant dans une hiérarchie de classes. Or, dés que l'on parle de hiérarchie de classe, on parle -- quasi systématiquement -- de classes présentant des comportements polymorphes. Surtout si le mot clé virtual induqe -- justement -- que le comportement d'une fonction particulière est destiné à être redéfini dans les classes dérivées. (Voilà, la boucle est bouclée )

    Or, lorsque l'on est face à une classe présentant un comportement polymorphe, on peut être confronté à deux grands cas de base : Soit, nous voulons qu'il soit possible de détruire les instances des classes dérivées lorsqu'elles sont connues comme étant du type de base, soit on estime inutile (voir dangereux) de permettre de détruire une instance de la classe dérivée lorsqu'elle est connue comme étant du type de la classe de base.

    Dans le premier cas, le destructeur de la classe de base doit être public et virtuel, dans le second cas, il est sans doute préférable de déclarer le destructeur protégé (et de ne pas le rendre virtuel, car cela ne sert à rien). Mais j'en viens presque à me demander si tu lis les réponses que l'on te fait, car je t'ai déjà expliqué tout cela ==>ici<==.

    Bon, d'accord, je répondais à une question différente, mais avec un peu de jugeote, tu aurais sans doute pu faire le rapprochement, tu ne crois pas
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 190
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 190
    Points : 17 146
    Points
    17 146
    Par défaut
    Sans compter que c'est aussi dans notre FAQ, qui est une mine d'or d'explications!
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    merci à vous tous .

Discussions similaires

  1. Tester l'existence d'une méthode dans une classe
    Par oumay dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 20/03/2015, 13h46
  2. [Reflexion] Récupération d'une méthode déclarée dans la classe supérieure
    Par masterboy01 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 14/12/2011, 19h28
  3. Accès à une méthode directement dans sa classe
    Par nico78200 dans le forum jQuery
    Réponses: 2
    Dernier message: 03/02/2011, 13h06
  4. Réponses: 16
    Dernier message: 26/10/2006, 16h17
  5. Réponses: 1
    Dernier message: 13/06/2006, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo