CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] Methode virtuelle pure

RedComet
RedComet
Niveau 7
03 août 2014 à 15:59:15

Bonjour; j'ai une question en faite; une méthode virtuelle pure d'une classe A est, si j'ai bien compris, une méthode qui DOIT être redéfini dans toutes les classes qui héritent de la classe A

Mais je voudrais alors savoir, pourquoi est-ce que ce code compile sans problème?

http://pastebin.com/Wf96g0HA

En plus je suis sûr qu'à un moment, j'avais réussi à provoquer l'erreur :o))

Google_Bot
Google_Bot
Niveau 14
03 août 2014 à 16:07:33

Les méthodes virtuelles pures doivent être redéfinies dans les classes descendantes _pour permettre leur instanciation_ (càd en faire des classes concrètes).
Sans ça, les classes qui héritent de ta classe abstraite demeurent elles aussi abstraites, mais il n'y a pas d'erreur pour autant.

Là, si tu essaies d'instancier un objet de classe B quelque part dans ton code, ça ne passera pas.

RedComet
RedComet
Niveau 7
03 août 2014 à 16:07:39

Désolé, j'ai rien dis, c'est en instanciant un objet B que l'erreur se provoque, je suis pourtant sûr d'avoir fait de même hier :-(

LEpigeon-888
LEpigeon-888
Niveau 12
03 août 2014 à 16:09:44

Pourquoi tu déclare le destructeur de A virtuel pure si c'est pour le définir après ? :doute:

Et t'as essayé d'instancier au moins ces classes ? Ou t'as fait que les définir ? :(

RedComet
RedComet
Niveau 7
03 août 2014 à 16:14:29

Le destructeur virtuelle pure de A, c'est surtout dans le cas où je voudrai forcer une classe à être abstraite sans qu'il y ait d'une méthode virtuelle pure, dans ce cas il faut déclarer le destructeur virtuelle pure et le redéfinir en dehors de la classe, mais dans mon exemple, c'était pas utile je pense, tu as raison :o))

RedComet
RedComet
Niveau 7
03 août 2014 à 16:29:29

En tout cas merci pour vos réponses :-)

J'aurai une dernière question, si je veux déclarer une méthode template virtuelle pure afin d'obliger les classes descendantes à la redéfinir, mais que je ne peux pas car les méthodes templates ne peuvent pas être virtuelle, y a-t-il un moyen propre de contourner le problème?

http://pastebin.com/F1w6rmEY

LEpigeon-888
LEpigeon-888
Niveau 12
03 août 2014 à 16:29:36

Arf, j'avais pas vu que j'étais aussi lent :(

+ concrètement, ça sert a quoi d'avoir une classe abstraite sans aucune méthode virtuelle pure :(

Enfin j'veux dire, si tu peux définir toutes les méthodes de ta classe, elle est plus si abstraite que ça du coups, donc en soit ça sert à quoi ?

RedComet
RedComet
Niveau 7
03 août 2014 à 16:36:59

Et bien si pour une raison ou une autre, tu voudrais qu'elle ne soit pas instanciable :o)) En faite je ne sais pas trop, je ne m'y connais pas des masses non plus en C++ :-(

RedComet
RedComet
Niveau 7
03 août 2014 à 16:40:18

(petite mise à jour du lien http://pastebin.com/mWcx7VVC )

LEpigeon-888
LEpigeon-888
Niveau 12
03 août 2014 à 17:00:13

"Et bien si pour une raison ou une autre, tu voudrais qu'elle ne soit pas instanciable :o)) "

Ca j'ai compris, ce que je voulais c'est justement un exemple de raison :hap:

RedComet
RedComet
Niveau 7
03 août 2014 à 17:07:27

Ce que j'essayais de dire, c'est que j'en connais pas des raisons pour vouloir qu'une classe soit abstraite alors qu'elle ne possède aucune méthode virtuelle pure :o))

Et d'ailleurs si ça se trouve y aurait aucune raison valables donc je ne sais pas, je ne m'y connais pas des masses comme déjà dit :o))

Google_Bot
Google_Bot
Niveau 14
04 août 2014 à 16:09:21

Pour ma part, j'ai pas l'impression que rendre un constructeur virtuel pur (au lieu de le rendre virtuel tout simplement) soit une bonne idée.
Je ne connais pas trop la norme, mais du coup je me demande ce qui se produit lors de la destruction d'un type hérité, si le destructeur du type dont il hérite est virtuel pur (dans ma tête, ça écrase le constructeur par défaut, MAIS ça ne fournit pas d'implémentation... du coup, aucun destructeur n'est appellable?).

Google_Bot
Google_Bot
Niveau 14
04 août 2014 à 16:17:57

http://en.cppreference.com/w/cpp/language/destructor#Pure_virtual_destructors

J'ai lu ailleurs qu'un appel à un destructeur virtuel pur sans implémentation provoque un comportement non-défini (souvent traduit par un crash de type "pure virtual function call").

Et là, dans le lien ci-dessus, je viens tout bêtement d'apprendre qu'on peut déclarer un destructeur virtuel pur MAIS lui fournir une implémentation, avec pour principal but de rendre la classe abstraite quand on n'a aucune autre méthode à rendre virtuelle pure. Bon... ça m'étonne un peu dans la mesure où le principe même d'une méthode virtuelle pure est de ne pas avoir d'implémentation, mais je ferai des essais chez moi ce soir pour voir :(

godrik
godrik
Niveau 30
04 août 2014 à 17:42:16

Le but d'une fonction virtuelle pure est de devoir etre surcharge. Pas de ne pas avoir d'implementation.
Il est frequent d'avoir une fonctione virtuelle pure qui a une implementation et qui doit etre appelle par les fonctions qui la surcharge.

void base::f() {
//something critical
}

void derived::f() {
base::f();
//do the remaining of f
}

Bunyan
Bunyan
Niveau 17
04 août 2014 à 20:18:16

C'est une manière de factoriser une série de comportement identique à un certains degrés.
Si toutes les filles réalisent exactement les mêmes opérations... autant appeler le parent et implémenter dedans. Ca factorise, augmente la maintenabilité et la lisibilité.

Pseudo supprimé
Pseudo supprimé 04 août 2014 à 21:39:03

Google_Bot Voir le profil de Google_Bot
Posté le 4 août 2014 à 16:09:21 Avertir un administrateur
Pour ma part, j'ai pas l'impression que rendre un constructeur virtuel pur (au lieu de le rendre virtuel tout simplement) soit une bonne idée.
Je ne connais pas trop la norme, mais du coup je me demande ce qui se produit lors de la destruction d'un type hérité, si le destructeur du type dont il hérite est virtuel pur (dans ma tête, ça écrase le constructeur par défaut, MAIS ça ne fournit pas d'implémentation... du coup, aucun destructeur n'est appellable?).

:d) quand tu dis "constructeur virtuel" à la 1ere ligne, tu veux plutôt dire "destructeur virtuel" je crois, non?

parce que, à ma connaissance, un constructeur virtuel (pur ou impur) ça n'existe pas

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment