OVH Cloud OVH Cloud

qu'est-ce que le polymorphisme?

41 réponses
Avatar
doryparker
En gros,qu'est-ce que le polymorphisme en C++?
Après plusieurs lectures de bouquins en C++,je n'arrive toujours pas à
vraiment comprendre ce que c'est(termes compliqués)

Merci.

10 réponses

1 2 3 4 5
Avatar
Luc Hermitte
Trognon Patrice wrote in
news:4166fe7e$0$8663$:

Donnant des cours sur C++ et Java je me dois d'utiliser un mˆme mot
pour d‚finir toujours le mˆme concept.


J'ai été ré-élevé à l'Eiffel avant de découvrir C++ et Java. IIRC, deux
lignes dans le cours signalaient que surcharge était aussi appelée
polymorphisme ad'hoc. Plus un vague commentairequi donnait une définition
générique de polymorphisme -- rien de bien exploitable, il est vrai.


Utiliser le mot polymorphisme dans differents contexte ne fait
qu'allourdir sa comprehension.


On utilise bien "héritage" pour mélanger :
- réutiliser du code
- être utilisé en place de
- truc hybride

AMHA, c'est bien plus mauvais.

Mais le concept initial est bien le même : le fait qu'un même élément
(fonction / objet) puisse revétir plusieurs formes.

Je prefere donc parler de polymorphisme pour ce que tu appelles


Pas seulement lui. Non non.

Remarquons que le terme de surcharge est aussi utilis‚ dans un autre
contexte en francais, alors qu'en anglais ils le differencient bien
en parlant d'overload et overrive.


Quoi ? Tu veux dire que l'on utilise surcharge en français pour désigner
overload ou override ??? C'est pas possible!? C'est des gens qui n'ont
pas compris la différence qui font ça ...

Bref, sur le fond nous sommes en phase, c'est la forme qui change.
Seulement, quand un débuttant pose une question sur un des concepts
de base, évitons de lui embrouiller l'esprit, surtout si il a déjà
été enduit en erreur par ce qu'il a lu.
Stroustrup n'est pas le plus grand pédagogue que je connaisse,
il suffit de lire sa bible pour s'en rendre compte ;)


Ces termes ne viennent pas de lui, et encore moins du C++. Bref. Hop!
http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29



--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>

Avatar
Trognon Patrice
Michel Michaud wrote:

Dans le message 4166fe7e$0$8663$,
Donnant des cours sur C++ et Java je me dois d'utiliser un même mot
pour définir toujours le même concept.


Comment doit-on interpréter cette phrase ? Par exemple, tu as
utilisé méthode en parlant de C++ alors qu'il n'y a pas de
méthode en C++ d'après la norme. Est-ce que tu nommes le concept
et espère ainsi ne pas avoir à parler du vocabulaire spécifique
ou si tu veux au contraire corriger les langages en donnant les
noms que tu crois correct ? (il faudrait alors savoir comment
nommer correctement les fonctions non virtuelles en C++ et les
fonctions final en Java...)

Utiliser le mot polymorphisme dans differents contexte ne fait
qu'allourdir sa comprehension.


Sauf que si c'est pour énoncer une réalité, c'est essentiel !



Ce que je dis c'est que je ne vois pas ce qu'on a à y gagner
à rendre un language déjà en sois très compliqué encore
plus compliqué par des débats sur une définition.

Vous parlez de l'objet, ok, parlons en aussi.

L'objet existe il pour etre utilisé uniquement en fac par
quelques théoriciens ?
Ou existe il pour etre utilisé industriellement afin de faciliter
le développement applicatif et la réutilisation du code ?

Si vous pensez que c'est la première solution, alors la je
jette les armes et je vous laisse à vos débats sur les mots.

Si vous pensez que c'est la seconde solution je persiste!!
Je persiste en pensant qu'il faut procéder étape par étape,
il a été admis dans le thread que quand on parle de polymorphisme
dans 90% des cas c'est le polymorphisme d'héritage.
Vu la question de Max, la réponse attendue est une réponse
pédagogique qui va lui permettre d'avancer dans la comprehension
de C++, et de l'objet.
Donc je persiste et je pense qu'il faut alors introduire
le polymorphisme d'héritage, et explique a coté l'overload
et l'override.
Puis une fois que c'est bien assimilé, la on peut introduire
le fait que c'est en fait, d'apres les théoriciens, d'autres
formes de polymorphisme.

Si la question initialement posée dans le NG est une question
qui attends une réponse proche de la théorie (sur laquelle
nous pouvons debattre sans fin), alors la réponse se doit
d'être proche de la théorie.

Si la question initialement posée dans le NG est une question
plus général, c'est à dire posée par un débuttant dans ce
language, la réponse se doit d'etre plus 'légère', donc moins
proche de la théorie.

Je ne dis pas qu'il ne faut pas introduire la théorie, je dis
qu'il faut l'introduire étape par étape en laissant à la personne
le temps d'assimiler ce qu'on lui explique.

Voila, maintenant je laisse la place aux théoriciens que vous etes.

Ce que je trouve dommage, c'est qu'avec notre débat (fort interessant
en ce qui me concerne) notre ami Max risque d'être conforté
dans l'idée que C++ est décidement un language impossible :(

Si tel est le cas, nous avons échoué.

Max, une réaction ?

Patrice.
http://www.javadevel.com


Avatar
Jean-Marc Bourguet
Trognon Patrice writes:

max wrote:

En gros,qu'est-ce que le polymorphisme en C++? Après
plusieurs lectures de bouquins en C++,je n'arrive
toujours pas à vraiment comprendre ce que c'est(termes
compliqués)

Merci.


Bonsoir,

Tout d'abord le polymorphisme n'est pas propre a C++ il
existe dans tous les languages objet, c'est donc avant
tout une des bases de l'objet.


Le polymorphisme existe aussi en dehors des languages
objets. Une fonction est polymorphisme si elle peut être
appelée avec des arguments de type différents. On peut
arguer si ce que Cardelli ("On understanding types, data
abstraction, and polymorphism") appelle le polymorphisme ad
hoc (celui résultant des conversions implicites et de la
surcharge) est réellement du polymorphisme ou du sucre
syntaxique camouflant du monomorphisme, mais la généricité
(disponibles avec les templates en C++ -- mais les templates
sont aussi une source de polymorphisme ad hoc avec les
spécialisations explicites) est du polymorphisme.

[Une explication du polymorphisme de substitution résultant
de l'héritage]

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Gabriel Dos Reis
Trognon Patrice writes:

| Fabien LE LEZ wrote:
|
| > On Fri, 08 Oct 2004 21:03:42 +0200, Trognon Patrice
| > :
| >
| >>Voici tout d'abord une définition
| >
| > ... du polymorphisme d'héritage.
| >
| > Je crois qu'on utilise aussi le mot "polymorphisme" pour parler du
| > mécanisme des templates, ainsi que pour parler de fonctions ayant le
| > même nom :
| >
| > void foo (int);
| > int foo (std::string, std::string);
| >
|
| Non, ce dont tu parles, c'est de la surcharge et non du polymorphisme.

Non. Il parle de polymorphisme paramétrique.

| voir mon post précédent, la définition y est complete ;)

Pas du tout. Elle est foncièrement incomplète et très partialle.

-- Gaby
Avatar
Gabriel Dos Reis
Trognon Patrice writes:

| Loïc Joly wrote:
|
| > Trognon Patrice wrote:
| >
| >> Fabien LE LEZ wrote:
| >>
| >>
| >>>On Fri, 08 Oct 2004 21:03:42 +0200, Trognon Patrice
| >>>:
| >>>
| >>>
| >>>>Voici tout d'abord une définition
| >>>
| >>>... du polymorphisme d'héritage.
| >>>
| >>>Je crois qu'on utilise aussi le mot "polymorphisme" pour parler du
| >>>mécanisme des templates, ainsi que pour parler de fonctions ayant le
| >>>même nom :
| >>>
| >>>void foo (int);
| >>>int foo (std::string, std::string);
| >>>
| >>
| >>
| >> Non, ce dont tu parles, c'est de la surcharge et non du polymorphisme.
| >
| > La surcharge est une forme de polymorphisme.
| >
| > Le polymorphisme est un concept surchargé ;) J'ai vu selon les cas les
| > gens voir de 3 à 5 types de polymorphisme différent. Dans tous les cas,
| > la surcharge de fonction en est une instance, aussi appelé polymorhisme
| > ad hoc.
| >
| > Il est vrai que dans le monde hors universitaire, quand on dit
| > polymorphisme tout court, on fait souvent implicitement référence au
| > polymorphisme d'héritage, que tu as décrit.
| >
|
| Donnant des cours sur C++ et Java je me dois d'utiliser un même mot
| pour définir toujours le même concept.

Groumph. Donc tu appelles les templates C++ des « generics » ?

| Utiliser le mot polymorphisme dans differents contexte ne fait qu'allourdir
| sa comprehension.

Ce qui veut dire que le prof n'en a pas compris la signification en
premier lieu.

-- Gaby
Avatar
Gabriel Dos Reis
Trognon Patrice writes:

[...]

| Si la question initialement posée dans le NG est une question
| plus général, c'est à dire posée par un débuttant dans ce
| language, la réponse se doit d'etre plus 'légère', donc moins
| proche de la théorie.

Et le fait est que dans la pratique, polymorphisme couvre aussi bien
la résolution dynamique (appel de fonctions virtuelles) que la
résolution statique (surcharge et templates). Ça ce n'est pas de la
théorie. Si un prof ne comprend pas, il devrait être interdit
d'enseignement de C++.

[...]

| Ce que je trouve dommage, c'est qu'avec notre débat (fort interessant
| en ce qui me concerne) notre ami Max risque d'être conforté
| dans l'idée que C++ est décidement un language impossible :(

Seulement quelques profs ignorants l'aident dans cette direction.
Et c'est reconfortant pour moi de voir que Michel Michaud fait
beaucoup d'effort pour redresser la barre, par exemple en corrigeant
des erreurs de traduction dans le TC++PL, vf.

-- Gaby
Avatar
Gabriel Dos Reis
Luc Hermitte writes:

| Associer le "polymorphisme ad'hoc" à la surcharge est encore antérieur,
| si je puis dire.

Oui, la première classification remonte à Strachey, je crois.
Et puis Cardelli et Wegner ont raffiné cette classification dans les
années 80.

-- Gaby
Avatar
James Kanze
Fabien LE LEZ writes:

|> On Fri, 08 Oct 2004 21:03:42 +0200, Trognon Patrice
|> :

|> >Voici tout d'abord une définition

|> ... du polymorphisme d'héritage.

|> Je crois qu'on utilise aussi le mot "polymorphisme" pour parler du
|> mécanisme des templates, ainsi que pour parler de fonctions ayant le
|> même nom :

|> void foo (int);
|> int foo (std::string, std::string);

|> Mais j'avoue que le vocabulaire n'est pas mot fort.

Il y a autant de définitions du mot polymorphisme qu'il y a des gens qui
s'en servent. Grosso mode, je dirais que quelque chose est polymorphique
quand tu ne sais pas le type réel qu'il y aurait à l'execution lorsque
tu écris le code. Mais évidemment, c'est ma définition à moi.

Il faudrait démander à Gaby. Je crois qu'il a étudié la question assez
en détail.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
James Kanze
"Michel Michaud" writes:

|> Dans le message 4166fe7e$0$8663$,

|> > Utiliser le mot polymorphisme dans differents contexte ne fait
|> > qu'allourdir sa comprehension.

|> Sauf que si c'est pour énoncer une réalité, c'est essentiel !

Je crois que le problème se posera surtout quand l'ancien élève
reconnaît que la bonne solution à son problème comporte le
polymorphisme, mais ne prendra pas en considération des templates, voire
une résolution lors de l'édition de liens.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
James Kanze
Luc Hermitte writes:

|> On utilise bien "héritage" pour mélanger :
|> - réutiliser du code
|> - être utilisé en place de
|> - truc hybride

En C++, héritage est une technique. Comme tu dis bien, c'est une
technique qui peut servir dans la résolution des problèmes divers. Le
polymorphisme est un concepte. Dont on peut se servir des moyens divers
à l'implémenter.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
1 2 3 4 5