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 :

Bien comprendre la virtualité et la généricité ???


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Bien comprendre la virtualité et la généricité ???
    Bonjour,

    Je suis étudiant en license informatique, et je me suis confronter à des questions pour lesquelles j'ai pas pu trouver de réponses.

    Les questions sont les suivantes:



    VIRTUALITE :

    1)- le polymorphisme implique-t-il nécessairement la virtualité? Justifier
    2)- A quoi sert un destructeur virtuel?
    3)- Pourquoi ne peut on avoir de constructeur virtuel?




    GENERICITE :

    1)- Héritage et généricité sont ils compatibles ? Justifier.
    2)- Donner un exemple simple dans lequel un arbre d'héritage peut être remplacé par un ensemble de classe génériques. Citer deux défauts pour la seconde approche?
    3)- Définir une fonction de produit scalaire générique entre deux vecteurs. La généricité portera sur deux points : le type des éléments et la taille des deux vecteurs. Quel est l'intérêt de la généricité sur la taille?



    Merci d'avance de votre aide.

  2. #2
    Membre habitué Avatar de Marco85
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 210
    Points : 187
    Points
    187
    Par défaut
    Est-ce qu'on peut avoir l'adresse de ton prof pour lui envoyer directement les réponses ?

    Sinon, dis nous ce que tu as déjà fait et après on en discutera ... On est pas là pour faire ton travail ...

    Marco85

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Une partie des réponses est dans la FAQ.

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Points : 86
    Points
    86
    Par défaut Re: Bien comprendre la virtualité et la généricité ???
    Citation Envoyé par realmadrid
    Bonjour,





    VIRTUALITE :

    1)- le polymorphisme implique-t-il nécessairement la virtualité? Justifier
    2)- A quoi sert un destructeur virtuel?
    3)- Pourquoi ne peut on avoir de constructeur virtuel?


    :

    1)
    si les fonctions ne sont pas virtual il n y a pas de polymorpysme!

    2)
    l adresse d un objet d une classe derive, garde dans un pointeur de classe base, se suffirait d appeler le destructeurs base pour detruire la partie base de l objet!!
    c est pour quoi on utilise le destructeur virtual

    3)
    au moment ou l objet est cree (et c est le seul moyen d utiliser un constructeur) on sait tjs de quel type est l objet!!

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut Re: Bien comprendre la virtualité et la généricité ???
    Citation Envoyé par d-a-v-e
    1)
    si les fonctions ne sont pas virtual il n y a pas de polymorpysme!
    T'es sûr ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A {};
     
    void Test( A & )
    {
    }
     
    class B : public A {};
     
    B b;
    Test( b );
    Luc pourrait aussi parler du polymorphisme paramétrique dans les templates.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    C'est de l'héritage, pas du polymorphisme.
    On parle bien sûr du polymorphisme ad-hoc.

    Pour qu'une classe soit polymorphe il faut qu'elle ait au moins une fonction virtuelle, ce qui implique la création d'une vtable.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    C'est de l'héritage, pas du polymorphisme.
    Test est une fonction qui accepte des arguments de différents types, elle est donc polymorphe.

    On parle bien sûr du polymorphisme ad-hoc.
    Je crois que tu te trompes dans ta nomenclature.

    Pour qu'une classe soit polymorphe il faut qu'elle ait au moins une fonction virtuelle,
    Non plus.

    ce qui implique la création d'une vtable.
    Ce n'est pas évident du tout. Il me semble avoir donné quelques autres techniques sur ce forum (ou était-ce sur fclc++?)

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Pour ajouter dans la confusion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<typename T>
    void Test( T ) {}
     
    Test<int>( 10 );
    Test<char>( 'c' );
    c'est aussi du polymorphisme, paramétré celui-là, contrairement au classique polymorphisme de type.

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Il me semble avoir donné quelques autres techniques sur ce forum (ou était-ce sur fclc++?)
    C'était bien ici il me semble.

    Citation Envoyé par Aurélien
    Luc pourrait aussi parler du polymorphisme paramétrique dans les templates
    Tout à fait. Juste parler de "Polymorphisme" dans le cadre des langages OO est un abus du langage qui est généralement un alias pour "polymorphisme d'nclusion" (ou d'héritage, ou de "types" (?)). En plus historiquement, il semblerait qu'il ne soit même pas le premier polymorphisme ayant existé dans le monde joyeux des langages de programmation.

    Sinon, comme Jean-Marc et Aurélien.
    En fait, personnellement, j'associe le polymorphisme (d'inclusion) à la substituabilité (cf Liskov et le LSP -- il semblerait qu'il y ait d'autres théories/visions que je n'ai pas encore approfondies (Cook ?))

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Test est une fonction qui accepte des arguments de différents types, elle est donc polymorphe.
    Pas vraiment.
    B est implicitement converti en A&, ce qui est possible car B hérite de A.

    Je crois que tu te trompes dans ta nomenclature.
    Oui apparemment c'est polymorphisme d'héritage.
    De toutes façons, sauf mention contraire, quand on dit polymorphisme en C++, ça veut dire ce truc là.

    Ce n'est pas évident du tout. Il me semble avoir donné quelques autres techniques sur ce forum (ou était-ce sur fclc++?)
    Il y a peut-être d'autres techniques, mais le fait est que C++ associe le caractère polymorphisme d'une classe à l'existence ou non pour celle-ci d'une vtable (ou v signifie virtual).

  11. #11
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Test est une fonction qui accepte des arguments de différents types, elle est donc polymorphe.

    Pas vraiment.
    B est implicitement converti en A&, ce qui est possible car B hérite de A.
    Quelque soit la manière grâce à laquelle c'est possible, si une même fonction Test accepte des arguments de plusieurs types, elle est polymorphe!

    Oui apparemment c'est polymorphisme d'héritage.
    De toutes façons, sauf mention contraire, quand on dit polymorphisme en C++, ça veut dire ce truc là.
    Oui et c'est un abus de langage, cf post de Luc.

    Sinon pour les questions sur la généricité :
    1) Oui. A toi de justifier ... pour peu que tu ais un bouquin, un cours, ou 2 3 articles/tutos sous la main, tu pourras te raffraichir la mémoire.

    2) ahhh à toi de trouver, mais sache que ce genre de situation a été rencontré maintes fois sur ce forum, utilise donc la recherche. Dans ces sujets, il y a de bonnes argumentations, donc cherche un peu avant de poster

    3) la fonction je pense que tu sais la faire toi même. une fois que tu auras fait cette fonction, l'intérêt te viendra de suite.

    A moi maintenant, j'ai une question :
    Tu as fait des recherches avant de venir poser tes questions ici ?

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    Test est une fonction qui accepte des arguments de différents types, elle est donc polymorphe.
    Pas vraiment.
    B est implicitement converti en A&, ce qui est possible car B hérite de A.
    Tu me montres alors une fonction polymorphe d'inclusion en C++?

    Je crois que tu te trompes dans ta nomenclature.
    Oui apparemment c'est polymorphisme d'héritage.
    De toutes façons, sauf mention contraire, quand on dit polymorphisme en C++, ça veut dire ce truc là.
    Non. C++ dispose des 4 types de polymorphismes, quand on parle de polymorphisme il faut preciser lequel. Qu'a la rigueur on ne parle pas du polymorphisme ad hoc, je comprends. Qu'on oublie les templates, ca pose des problemes. En particulier dans un contexte intitule "Bien comprendre la virtualité et la généricité ???"

    Ce n'est pas évident du tout. Il me semble avoir donné quelques autres techniques sur ce forum (ou était-ce sur fclc++?)
    Il y a peut-être d'autres techniques, mais le fait est que C++ associe le caractère polymorphisme d'une classe à l'existence ou non pour celle-ci d'une vtable (ou v signifie virtual).
    Il n'est pas necessaire d'avoir une vtable pour implementer les fonctions virtuelles.

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    polymorphisme : "qui peut prendre plusieurs formes". B peut être utilisée comme un A, car B *est un* A. C'est bien du polymorphisme, sans virtualité.
    La virtualité implique (peut impliquer?) le polymorphisme, pas l'inverse.

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Bonjour, voila mes réponses personnelles:

    VIRTUALITE :

    1)- le polymorphisme implique-t-il nécessairement la virtualité? Justifier
    2)- A quoi sert un destructeur virtuel?
    3)- Pourquoi ne peut on avoir de constructeur virtuel?

    ----------------------------------------------------------------------------------------

    1) Non, car il existe une forme du polymorphisme dite "polymorphisme faible" ou aussi la surcharge des opéerateurs.
    2) Le destructeur virtuel sert à faire la bonne destruction du bon objet:
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    class A { ... };
    class B : public A { ... };
    class C : public A { ... };
    class D : public B { ... }; 
     
    // Initialisation du tableau de pointeur sur des objets A
    // Or, les autres classes dérivent de la classe mère A 
    // ==> On peut stocker le objets filles dans le tableau
     
    A* tab[5]; 
    tab[0] = new A;
    tab[1] = new B;
    tab[2] = new C;
    tab[3] = new D;
    tab[4] = new B;
     
    Si on effectu l'opération suivante :
     
    for(int i = 0; i < 5; i++)
    {
       delete tab[i]; // Appel au destructeur de A :  ~A()
                           // Alors que si le destructeur est virtuel, on fera appel au bon destructeur de              
                           // chaque objet.
    }
    3) On ne peut pas avoir de constructeur virtuel, car lors de la construction d'un objet , la construction est faite par defaut sur le bon objet en faisant appel au bon constructeur.

    J'attends vos remarques et vos suggestions.

    Merci d'avance

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Non. C++ dispose des 4 types de polymorphismes, quand on parle de polymorphisme il faut preciser lequel. Qu'a la rigueur on ne parle pas du polymorphisme ad hoc, je comprends. Qu'on oublie les templates, ca pose des problemes. En particulier dans un contexte intitule "Bien comprendre la virtualité et la généricité ???"
    Vérifie dans la norme.
    Je crois bien qu'il n'y ait jamais le mot polymorphisme qui y soit utilisé pour faire réference aux autres aspects.

  16. #16
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    google -> cardelli polymorphism

    Le polymorphisme est un principe qui trascende le langage. D'ailleurs, la recherche (ctrl-f) dans la norme ne m'a absolument rien donné sur "polymorphism".
    C'est un principe de conception alors que la norme a, je trouve, une description limite syntaxique de ce que le langage définit et permet.

    @ realmadrid
    1- Je n'ai jamais entendu parler de "polymorphisme faible". D'autres éléments de réponse ont été donnés. A toi de formler ce que tu as compris.

    2- C'est pas dans toutes les FAQs de C++ que le problème de la destruction via un pointeur parent, dont le type (parent) n'a pas de destructeur virtuel, conduit à un comportement dit indéfini ?

  17. #17
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    Non. C++ dispose des 4 types de polymorphismes, quand on parle de polymorphisme il faut preciser lequel. Qu'a la rigueur on ne parle pas du polymorphisme ad hoc, je comprends. Qu'on oublie les templates, ca pose des problemes. En particulier dans un contexte intitule "Bien comprendre la virtualité et la généricité ???"
    Vérifie dans la norme.
    Verification faite. "polymorphism" ne se trouve nulle part dans la norme.

    Tu veux une autre recherche?

    Edit: J'avais pas vu qu'il y a avait une deuxieme page.

  18. #18
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Virtual functions support dynamic binding and object-oriented program-
    ming. A class that declares or inherits a virtual function is called
    a polymorphic class.
    10.3.1 (version gratuite de 1997).

  19. #19
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    Virtual functions support dynamic binding and object-oriented program-
    ming. A class that declares or inherits a virtual function is called
    a polymorphic class.
    10.3.1 (version gratuite de 1997).
    Tu as cherché les autres occurences de "polymorphic"? Je vois entre autres:

    Citation Envoyé par ISO/IEC 148882:1998(E) 22.1.1/1
    Class locale implements a type-safe polymorphic set of facets, indexed by facet type.
    où il est bien question du polymorphisme paramétrique.

  20. #20
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Oui et ?
    Ça ne change rien à ce que je dis.

    Sauf mention contraire (et là il y a une mention contraire) la notion de polymorphisme en C++ correspond au polymorphisme d'héritage.

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/11/2008, 12h22
  2. Nom de domaine : pour bien comprendre
    Par joker vb dans le forum Domaines
    Réponses: 4
    Dernier message: 02/08/2008, 17h12
  3. Bien utiliser et bien comprendre QtDesigner
    Par ZouBi dans le forum Qt
    Réponses: 6
    Dernier message: 12/03/2008, 23h30
  4. Bien comprendre l'allocation dynamique
    Par Haze. dans le forum Débuter
    Réponses: 4
    Dernier message: 20/11/2007, 12h51
  5. bien comprendre le QUERY
    Par issam33 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/09/2007, 17h42

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