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

C++ Discussion :

Les fonctions virtuelles


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Mars 2013
    Messages
    11
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par d�faut Les fonctions virtuelles
    Bonjour

    A quoi sert la fonction virtuelle ?

  2. #2
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    En gros, une fonction virtuelle indique au compilateur
    je vais d�finir un comportement particulier pour cette fonction, adapt� pour le type que je suis occup� � d�finir, mais, si quelqu'un d�finit un type qui h�rite de mon type particulier, il pourra d�cider de red�finir ce comportement s'il je juge utile.
    Ce genre de fonction permet de d�finir ce que l'on appelle des comportements polymorphes quand on a besoin de classes substituables aux termes du principe de substituabilit� de Liskov.

    Un comportement polymorphe est un comportement susceptible de s'adapter aux circonstances lorsqu'il est invoqu�.

    Le fait que tu aies un menu contextuel diff�rent quand tu en demande l'affichage sur diff�rents �l�ment (par exemple: un �l�ment qui se trouve sur le bureau ou sur la barre de tache de ton syst�me d'exploitation) peut �tre consid�r� comme �tant un comportement polymorphe : c'est toujours un menu contextuel, il te permet toujours d'acc�der � diff�rentes actions, mais les actions auxquelles il te donnent acc�s sont adapt�es en fonction des circonstances.

    Le polymorphisme -- la capacit� d'un comportement � s'adapter aux circonstances -- peut �tre class� en trois cat�gories distinctes : Le polymorphisme ad-hoc, le polymorphisme param�trique (sp�cifique � C++) et le polymorphisme universel.

    Le polymorphisme ad-hoc est lui-m�me s�par� en deux cat�gories:
    1. La coercition qui est la capacit� de certains types � �tre convertis en d'autres de mani�re plus ou moins implicite et
    2. La surcharge qui est la possibilit� dont dispose le d�veloppeur de d�finir deux fonctions qui portent le m�me nom mais qui prennent des arguments dont le type est diff�rents (et dont le comportement sera similaire)

    Le polymorphisme param�trique est la capacit� d'un comportement � s'adapter au type de l'objet sur lequel il est invoqu� en utilisant le paradigme g�n�rique "je ne sais pas quel type d'objet j'utilise, mais je sais comment je vais l'utiliser".

    Enfin, le polymorphisme universel, celui qui est autoris� par les fonctions virtuelles, s'appelle aussi le polymorphisme d'inclusion.

    Le principe est de se dire : je cr�e un type de base (FormeGeom�trique, par exemple), qui doit exposer un comportement ("Dessines-toi", par exemple). Ce comportement devra �tre diff�rent pour un cercle que pour un carr�, qui sont tous les deux des FormesG�om�triques.

    On en arrive donc � d�finir une classe FormeGeometrique qui pourrait ressembler �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    class FormeGeometrique{
        public:
            virtual void dessineToi() const{
                std::cout<<"je suis une forme géométrique"<<std::endl;
             }
    };
    La fonction dessineToi pourrait ne rien faire, car on ne sait, a priori, pas comment dessiner une forme g�om�trique dont on ignore tout (on pourrait aussi d�clarer cette fonction comme "virtuelle pure" afin d'indiquer au compilateur qu'on est dans l'incapacit� de d�finir le comportement en question)

    On ferait alors h�riter publiquement la classe Cercle de FormeGeometrique, parce qu'un cercle est bel et bien une forme g�om�trique. Et nous comme savons comment demander au cercle de se tracer, nous pouvons red�finir la fonction dessinesToi pour le cercle.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    class Cercle :FormeGeometrique{
        public:
            virtual void dessineToi() cons{
                std::cout<<"je suis un cercle"<<std::endl;
             }
     
    };
    Et nous pourrions faire de m�me avec la classe Carre, pour les m�mes raisons:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    class Carre :FormeGeometrique{
        public:
            virtual void dessineToi() const{
                std::cout<<"je suis un carré"<<std::endl;
             }
     
    };
    A partir de l�, nous pouvons envisager de cr�er une collection de "formes g�om�triques" -- sans pr�cision -- qui contiendrait plusieurs carr� et plusieurs cercles, sous une forme proche de (C++11 inside)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(){
        std::vector<std::unique_ptr<FormeGeometrique> tab;
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Cercle));
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Carre));
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Cercle));
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Carre));
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Cercle));
        return 0;
    }
    Tu remarqueras que j'ai alors dans tab trois cercles et deux carr�s. Si nous d�cidons d parcourir tous les �l�ments de tab et de leur demander de s'afficher, sous une forme proche de (C++11 inside)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main(){
        std::vector<std::unique_ptr<FormeGeometrique> tab;
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Cercle));
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Carre));
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Cercle));
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Carre));
        tab.emplace_back(std::unique_ptr<FormeGeometrique>(new Cercle));
        for(auto const & it : tab){
            it.get()->dessinesToi();
        }
        return 0;
    }
    Nous pourrons remarquer que le comportement observ� se sera bel et bien adapt� au type de l'objet r�el (carr� ou cercle) car le premier, le troisi�me et le cinqui�me �l�ment afficheront "je suis un cercle" alors que le deuxi�me et le quatri�me afficheront "je suis un carr�".

    Voil� ce qu'est une fonction virtuelle, et voil� � quoi elle sert
    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

  4. #4
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    On ne va pas �tre d'accord ici. Pour commencer la classification classique (celle de Cardelli et Wargner dans On Understanding Types), c'est

    * polymorphisme ad-hoc, c�d n�cessitant une d�finition pour chaque variante, est bien subdivis� en coercition et surcharge,

    * polymorphisme universel, c�d capable de traiter une infinit� de types, est subdivis� en param�trique (qui n'est pas propre au C++, il est pr�sent en Ada, Eiffel et surtout dans les langages fonctionnels o� polymorphisme signifie souvent polymorphisme param�trique), et d'inclusion qui est qu'une valeur peut �tre de plusieurs types.

    Mais o� je ne suis pas du tout d'accord, c'est que le polymorphisme d'inclusion c'est les fonctions virtuelles. Les fonctions virtuelles c'est un type de surcharge, r�solue dynamiquement, mais ce n'est "que" de la surcharge. En C++, le principal effet du polymorphisme d'inclusion, c'est le fait que
    le type statique peut �tre diff�rent du type dynamique, qu'un pointeur ou une r�f�rence peut d�signer des objets de type diff�rent (n'importe quelle type d�riv� de la classe de base).

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Salut

    Citation Envoy� par Jean-Marc.Bourguet Voir le message
    Mais o� je ne suis pas du tout d'accord, c'est que le polymorphisme d'inclusion c'est les fonctions virtuelles. Les fonctions virtuelles c'est un type de surcharge, r�solue dynamiquement, mais ce n'est "que" de la surcharge. En C++, le principal effet du polymorphisme d'inclusion, c'est le fait que
    le type statique peut �tre diff�rent du type dynamique, qu'un pointeur ou une r�f�rence peut d�signer des objets de type diff�rent (n'importe quelle type d�riv� de la classe de base).
    C'est vrai, mais les fonctions virtuelles ne peuvent �tre exploit�es qu'en utilisant le polymorphisme d'inclusion, m�me si elles ne sont pas sa seule propri�t�, on peut comprendre le raccourci emprunt� par Koala.

  6. #6
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par jblecanard Voir le message
    C'est vrai, mais les fonctions virtuelles ne peuvent �tre exploit�es qu'en utilisant le polymorphisme d'inclusion, m�me si elles ne sont pas sa seule propri�t�, on peut comprendre le raccourci emprunt� par Koala.
    Je n'arrive pas a voir dans ce que tu appelles un raccourci autre chose que de la confusion. Si je vois un interet a une presentation de ce que sont les fonctions virtuelles qui ne fait pas appel a une classification des types de polymorphismes (l'interet principal d'une telle classification n'est perceptible qu'apres avoir ete exposes a ces differentes types, de preference dans differents langages -- bien que le C++ qui dispose des quatres types avec trois mecanismes differents de surcharge soit probablement le langage qui permet d'aborder le plus facilement la classification complete), je ne vois aucun interet a presenter une telle classification pour ensuite ne pas placer les fonctions virtuelles a leur place dedans.

Discussions similaires

  1. Question sur les fonctions virtuelles
    Par beegees dans le forum C++
    R�ponses: 9
    Dernier message: 13/04/2008, 19h54
  2. Bug sur les fonctions virtuelles
    Par Anthony.Desvernois dans le forum C++
    R�ponses: 4
    Dernier message: 28/01/2008, 17h30
  3. R�ponses: 2
    Dernier message: 07/10/2004, 17h00

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