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
no.bcausse.spam
Arnaud Meurgues wrote:

ça s'appelle aussi un message (et sans doute en
objective-C aussi, du coup).


exact.

--
bruno Causse
http://perso.wanadoo.fr/othello

Avatar
Alexandre
bonsoir,

<----------------Cirque.h------------------>
class Cirque {

// List de felins
List listeDeFelins ;


tiens tu viens de Java, non ? List n'existe pas en C++. A la place,
std::list< Felin*> listeDeFelins;


// Constructeur.
Cirque();

// tout le monde parle
void parlezTous() ;
} ;
<----------------/Cirque.h------------------>

<----------------Cirque.cpp------------------>
#include "Cirque.h"

//---
// Dans mon cirque j'ai 2 Chats et 1 Lion
Cirque::Cirque() {


// liste n'a pas besoin de new en C++
// listeDeFelins = new List();

list.add( new Chat() ) ;
list.add( new Lion() ) ;
list.add( new Chat() ) ;


encore syntaxe "java". En C++ donne :
list.push_back(new Chat);
list.push_back(new Lion);
list.push_back(new Chat);

void Cirque::parlezTous() {
for( int = 0 ; i < 3 , i++ ) {
//---
// Le premier va me renvoyer un Chat
// Le second va me renvoyer un Lion
// Le troisieme va me renvoyer un Chat
Felin felin = (Felin)list.get( i ) ;

// Ici mise en oeuvre du polymorphisme
felin.parler();


en java, oui. En C++ ça ne marche pas ;-)
for( list<Felin*>::iterator iþlins.begin() ; i!= Felins.end();
++i)
{
Felin *felin = *i;
felin->parler();
}

on remarque au passage que la syntaxe java est un peu plus lisible ;-)

Dans la mise en oeuvre du polymorphisme (l'appel de ma méthode
parler) peu imporque que ce soit un chat ou un lion, ce que
je recupere c'est un Felin, et comme la méthode parler est
définie dans la class Felin, je peux donc l'invoquer.
Si c'est un chat qui a été instanciée, c'est la méthode
parler du chat qui va etre exécutée.
Si c'est un lion qui a été instanciée, c'est la méthode
parler du lion qui va etre exécutée.


ça c'est bien la même chose en C++ qu'en Java, comme tu le signales
d'ailleurs plus haut dans ton post.


Le programme affiche donc :
Miaou
ROOAAAA
Miaou

dans la méthode parlezTous, je n'ai pas besoin de manipuler
un Chat ou un Lion spécialisé, j'ai uniquement besoin de manipuler
un objet qui a la méthode Parlez, MAIS je veux que ce soit
bien le lion qui parle si c'est un lion, et le chat qui parle
si c'est un chat.


juste pour éviter au PO de ne pas comprendre pourquoi ça ne compile pas, ton
code ;-)
Sinon ton explication est très claire, bravo.

Avatar
Alexandre
bonsoir,

Il y a une question intéressante, je crois : est-ce qu'il convient de
parler du tout de « polymorphisme » dans un cours de C++ ou de Java. Le
concepte de polymorphisme est indépendant du langage -- les deux
langages ont divers moyens de l'implémenter, et tous les moyens qui y
servent servent aussi à résoudre d'autres problèmes. (En Java Swing,
AbstractButton hérite de SwingConstants. J'espère qu'il ne présente pas
cet héritage comme du polymorphisme.)


je me pose d'ailleurs une autre question : est-ce utile un cours de C++ ou
de Java ?


Où je verrais bien le polymorphisme, c'est dans un cours sur la
programmation, plus particulièrement sur la programmation orientée
objet.


là un cours est utile. Apprendre un langage en amphi me parait peu
interessant. Il est évident qu'en TP, il faut bien maniper un langage ou un
autre.
Personnelement dans mes cours de PO, je parle du polymorphisme (entre
autres) et montre en TP les différentes manières de l'implémenter, suivant
les cas (par exemple avec de l'héritage, bien sûr, mais également en
utilisant les templates...), en C++, en Java ou autre s'il le faut (on va
essayer qq TP en C# cette année... non,non, pas taper sur la tete !)

(Mais je me pose la question s'il y un sens à faire un cours sur
la programmation orientée objet, par rapport à un cours sur la
programmation tout courte, qui couvre l'orientation objet, mais aussi la
fonctionnelle, etc. Parce que j'avoue que dans environ trente ans de
programmation, il ne m'est jamais arrivé d'écrire un programme qui
n'utilise qu'un seul paradigme.)


moi non plus (même si c'est en moins de temps ;-)) mais il faut bien, en
cours, faire des découpages thématiques. D'où un cours de PO qui n'est pas
absurde en soit (même s'il est AMA peu utile seul bien sur)

Avatar
drkm
"Alexandre" writes:

for( int = 0 ; i < 3 , i++ ) {
//---
// Le premier va me renvoyer un Chat
// Le second va me renvoyer un Lion
// Le troisieme va me renvoyer un Chat
Felin felin = (Felin)list.get( i ) ;

// Ici mise en oeuvre du polymorphisme
felin.parler();


en java, oui. En C++ ça ne marche pas ;-)
for( list<Felin*>::iterator iþlins.begin() ; i!= Felins.end();
++i)
{
Felin *felin = *i;
felin->parler();
}

on remarque au passage que la syntaxe java est un peu plus lisible ;-)


Bof. Je préfère :

typedef std::list< Felin * >::iterator Iter ;
for( Iter felin = Felins.begin() ; felin != Felins.end() ; ++ felin ) {
felin->parler() ;
}

ou :

for( std::list< Felin * >::iterator felin = Felins.begin() ;
felin != Felins.end() ;
++ felin ) {
felin->parler() ;
}

à (hormis le fait d'utiliser 3 au lieu de Felins.size()) :

for ( int = 0 ; i < 3 ; ++ i ) {
Felin felin = ( Felin ) Felins.get( i ) ;
felin.parler() ;
}

ou :

for ( int = 0 ; i < 3 ; ++ i ) {
( ( Felin ) Felins.get( i ) ).parler() ;
}

ou surtout (il me semble que l'on peut utiliser java.util.Iterator
avec java.util.List, mais je ne suis pas sûr) :

Iterator it = Felins.iterator() ;
while ( it.hasNext() ) {
Felin felin = ( Felin ) it.next() ;
felin.parler() ;
}

Question d'habitude, sans doute. Mais le cast doit également y être
pour beaucoup.

Tiens, à ce propos, une citation juste pour rire (une des premières
choses que j'ai vu à propos des Generics de Java), tirée de
<URL:http://java.sun.com/developer/technicalArticles/releases/j2se15langfeat/> :

Generics simply provide compile-time typesafety and eliminate the
need for casts. [...] A C++ template on the other hand is just a
fancy macro processor;

--drkm


Avatar
Fabien LE LEZ
On Mon, 11 Oct 2004 20:27:40 +0200, "Alexandre"
:

for( list<Felin*>::iterator iþlins.begin() ; i!= Felins.end();
++i)
{
Felin *felin = *i;
felin->parler();
}


Plus simple :

for_each (Felins.begin(), Felins.end(), mem_fun (&Felin::parler));



--
;-)

Avatar
Karl Tombre
max a écrit:

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.


Il y a une définition très complète et a priori bien faite du
polymorphisme dans la version anglaise de Wikipedia

http://en.wikipedia.org/wiki/Polymorphism_(computer_science)

KT

Avatar
bruno_perso
Seulement quelques profs ignorants !!!!!!!

Quand je vois les étudiants au niveau thèse et que je dois leur
expliquer quelques usages des template, je me dis que ce n'est pas
quelques profs ignorants ! mais la majorité des profs enseignant le C++
dans les Ecoles sur PARIS.

Je ne parlerais pas nos collègues chercheurs (spécialisés dans la les
langages) pour qui parce qu'ils ne sont pas à même de comprendre le
langage en une journée, le langage est mal conçu ! Bon, heureusement que
pour ces personnes là, il y a eu Java qui est venu. Ils ont eu
l'impression de comprendre un langage dit orienté objet.

Gabriel Dos Reis wrote:

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
Marc Boyer
bruno_perso wrote:
Je ne parlerais pas nos collègues chercheurs (spécialisés dans la les
langages) pour qui parce qu'ils ne sont pas à même de comprendre le
langage en une journée, le langage est mal conçu !


J'adore ce genre de généralisation.

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...

Avatar
bruno_perso
Jean-Marc Bourguet wrote:
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+



Je pense qu'une des raisons pour lesquelles pas mal de personnes
considèrent que les templates ne sont pas du vrai polymorphisme, --
notamment les personnes originaires de la communauté des langages
fonctionnels -- c'est parce que les compilateurs engendrent une version
spécialisée du code pour chaque type d'instanciation, rappelant en cela
plus les foncteurs de SML que les fonctions polymorphes des langages
fonctionnels.

J'ai eu bien parfois eu bien du mal à faire comprendre l'intérêt des
template à des collègues qui n'y voyaient qu'une technique de réécriture
de code et non pas un concept sémantique fort du langage !

A+



Avatar
Jean-Marc Bourguet
bruno_perso writes:

Je pense qu'une des raisons pour lesquelles pas mal de
personnes considèrent que les templates ne sont pas du
vrai polymorphisme, -- notamment les personnes originaires
de la communauté des langages fonctionnels -- c'est parce
que les compilateurs engendrent une version spécialisée du
code pour chaque type d'instanciation,


Mais ce point ne serait qu'un détail d'implémentation s'il
n'y avait la possibilité de spécialisation explicite (et
peut-être quelques particularités avec les membres statiques
et autres choses du même tonneau). Qui donne justement
plus de puissance d'expression aux templates...

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

1 2 3 4 5