question de débutant, casts & héritage - C++ - Programmation
Marsh Posté le 25-02-2008 à 18:06:54
dwogsi a écrit : 'deux' est de type A, donc pas de méthode set_pos2() qui n'est présente que dans B. |
pourtant j'ai déjà vue plusieurs fois l'ecriture du type
Code :
|
avec B qui dérive de A.
quel serait l'intérêt ?
Marsh Posté le 25-02-2008 à 18:10:57
Ba dans ma logique, on devrait toujours savoir de quel type est une variable. On évite ainsi d'appeler des méthodes qui n'existent pas dans l'objet par exemple.
Donc je serais tenté de te dire qu'une variable de type A ne peut contenir qu'un objet de type A (ça parait évident...).
Cela-dit, je ne suis pas un spécialiste, faudrait que quelqu'un confirme/infirme.
Marsh Posté le 25-02-2008 à 20:20:50
l'intérêt c'est par exemple d'avoir un vector de pointeur sur A que tu remplis de manière aveugle avec des
instances de filles de A pour ensuite appeler polymorphiquement des méthodes de l'interface de A.
exemple de mon cours.
Code :
|
L'intérêt de l'héritage est de FACTORISER les comportements. Donc en général la classe mère expose une interface
commune à toutes ces filles.
Marsh Posté le 26-02-2008 à 11:12:50
Joel F a écrit : l'intérêt c'est par exemple d'avoir un vector de pointeur sur A que tu remplis de manière aveugle avec des exemple de mon cours.
|
salut,
merci pour ta réponse. Je comprend bien l'exemple, et je pense voire l'interêt du truc ? c'est a dire que c'est générique. Cependant, je ne comprend toujours pas bien pourquoi dans certains cas on fait
Code :
|
avec B qui dérive de A, alors qu'on ne peut manifestement pas accéder aux champs de B (qui ne sont pas contenus dans A) par la suite
ps : les destructeurs virtuels sont-ils nécessaires dans l'exemple ?
Marsh Posté le 26-02-2008 à 11:22:15
c'est pourtant bien ce que je fais ici , je mets un B* dans des A*.
Pour savoir de quelles types effectif un A* est, on utilise dynamic_cast.
Code :
|
Les destructeurs virtuels assurent la présence et la prise en compte de la table de méthodes virtuelles. Il est de bon ton de les laisser comme ça
Marsh Posté le 26-02-2008 à 12:19:32
ok, merci
alors si j'ai bien tout lu Freud, je comprend que quand on fait :
Code :
|
avec B qui dérive de A, c'est qu'on fait du polymorphisme et que donc que A utilise au moins une fonction virtuelle. Autrement ca n'a aucun intérêt, non ?
Joel F a écrit :
|
mais dans cet exemple, ca ne sert a rien de les mettre non ?
Marsh Posté le 26-02-2008 à 13:45:20
Comme tu fais un new d'un type B, il serait logique de faire un delete d'un type B.
Or si tu fais un delete sur "ab" (dans l'exemple), s'il n'a pas de destructeur virtuel il utilisera le destructeur de A et non de B.
En gros, pour résumer ne pas avoir de destructeur virtuel c'est comme faire :
delete (A*)new B; |
Sinon dans l'exemple comme Vehicule n'a pas de destructeur virtuel, même si y en a dans les classes filles, ca sera toujours celui de Vehicule qui sera appelé.
Marsh Posté le 27-02-2008 à 10:58:34
Tarabiscote a écrit : Comme tu fais un new d'un type B, il serait logique de faire un delete d'un type B.
|
ok, merci
ce que je voulais dire, c'est que dans l'exemple de Joel F. il faudrait un destructeur virtuel pour la classe de base, mais les destructeurs virtuels dans les classes dérivées (les non abstraites dans l'exemple) ne servent à rien (sauf si on dérive ces classes)
j'ai bon ?
Marsh Posté le 27-02-2008 à 13:27:07
oui, mais comme disait feu Bruno Garcia,
"virtual un jour, virtual toujours"
les mettre virtual alors que ca a part l'air de servir t'évitera des incongruités le jour ou tu dérivera de Voiture pour faire VoitureAmphibie et que tu auras oublié le virtual sur le destructeur
Marsh Posté le 27-02-2008 à 15:24:51
Joel F a écrit : oui, mais comme disait feu Bruno Garcia, |
ok, merci cependant j'ai lu (je ne sais plus où) qu'il ne fallait pas rajouter de destructeurs virtual par défaut car ca ralenti l'execution
Marsh Posté le 27-02-2008 à 16:13:37
oui en 1878 avec gcc 0.0.1 c'était le cas mais depuis l'avènement des vrais compilo ... ça n'a aucun sens de dire ça.
Marsh Posté le 27-02-2008 à 17:46:26
Joel F a écrit : oui en 1878 avec gcc 0.0.1 c'était le cas mais depuis l'avènement des vrais compilo ... ça n'a aucun sens de dire ça. |
lol
ok!
ps : mais je croyais que virtual & co c'etait "late binding", donc décidées au moment de l'execution (donc apres compilation); me trompe-je ?
Marsh Posté le 27-02-2008 à 18:10:45
non tu ne te trompes pas. Ma remarque portait sur le fait que cette LU du virtual qui coute date un peu des compilos foireux genre 2.95.2 et antérieur.
Marsh Posté le 25-02-2008 à 17:57:54
Bonjour,
je suis super débutant en c++ ... quelqu'un pourrait-il m"expliquer pourquoi quand je fait ce code :
j'obtiens l'erreur suivante :
error: 'class A' has no member named 'set_pos2'
en fait je ne comprend pas pourquoi, si on fait un new B, on ne peut pas appeler une méthode de cette classe parce qu'un pointeur du type de la classe mere pointe dessus.
merci par avance
Message édité par in_your_phion le 25-02-2008 à 18:03:17