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 :

Question sur les fonctions virtuelles


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Question sur les fonctions virtuelles
    Bonjour tout le monde,

    Nous avons appris cette semaine les classes virtuelles, en tout cas le début.

    J'ai un programme qui lit les lignes d'un fichier txt, une par une.

    Il lit la première ligne :

    V MLK816 5 1.2
    V pour voiture, MLK816 s'est l'immatriculation, 5 s'est le nombre de place et 1.2 s'est le volume transportable de marchandise.

    Nous avons plusieurs méthodes virtuelles dont celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	virtual bool		EstValide() const;
    Cette ligne de code fait appel à la fonction EstValide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if (!Modele.EstValide()) return false;
    Vue qu'il y'a 4 fonctions "EstValide" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool CVehicule::EstValide() const
    {
    	return (strlen(Immatriculation()) >= 5) && (NombrePlaces() >= 1);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool CVoiture::EstValide() const
    {
    	return (CVehicule::EstValide()) && (VolumeMarchandise() > 0.0);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool CCamion::EstValide() const
    {
    	return (CVehicule::EstValide()) && (VolumeMarchandise() > 0.0) && (PoidsMarchandise() > 0.0);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool CBus::EstValide() const
    {
    	return (CVehicule::EstValide()) && (NombreRangs() > 0);
    }
    je me demandais comment il pouvait aller sur la bonne fonction directement.

    Il va donc directement sur cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool CVoiture::EstValide() const
    {
    	return (CVehicule::EstValide()) && (VolumeMarchandise() > 0.0);
    }
    Car s'est une voiture.

    Qu'est-ce qu'il lui dit que s'est bien une voiture ?

    Le but de ma question est d'essayer de comprendre les fonctions virtuelles.

    Je vous laisse mon code au cas où.

    Merci d'avance pour votre aide et bon Dimanche.

    beegees

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Chaque ligne du fichier texte commence par une lettre indiquant le type de véhicule. En fonction ce cette lettre, le programme peut construire le bon objet correspondant au véhicule.

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par jeremya Voir le message
    Chaque ligne du fichier texte commence par une lettre indiquant le type de véhicule. En fonction ce cette lettre, le programme peut construire le bon objet correspondant au véhicule.
    Merci pour ta réponse.

    En fait, ça j'avais compris.

    J'ai vu qu'il y'a une vtable qui est crée pour chaque objet.

    Donc si j'ai 10 voitures, j'aurais 10 vtable ?

    Merci encore.

    beegees

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si je comprends bien, tu ne veux pas savoir comment ça marche en terme de spécifications du langage, mais comment c'est implémenté derrière. Le mécanisme est effectivement en général implémenté à l'aide de vtables.

    Il y a une vtable par classe (par par objet) qui contient des pointeurs sur les fonctions virtuelles. CHaque objet lui possède un pointeur sur la vtable qui lui correspond.
    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
     
    class A
    {
      int i;
      virtual void f();
      virtual void g();
      void h();
    };
     
    class B : public A
    {
      int j;
      virtual void f();
      virtual void f2();
    };
    Un objet A ressemblera à :
    - Pointeur Vtable A
    - i

    Un objet B ressemblera à :
    - Pointeur Vtable B
    - i
    - j

    La Vtable de A ressemblera à :
    - Infos de RTTI
    - &A::f
    - &A::g

    La VTable de B ressemblera à :
    - Infos de RTTI
    - &B::f
    - &A::g
    - &B::f2
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par beegees Voir le message
    Nous avons appris cette semaine les classes virtuelles, en tout cas le début.
    Il n'existe rien de tel en C++. Je suppose que tu veux parler de classes disposant de fonctions membre virtuelles, voire de classes abstraites.



    Citation Envoyé par beeges
    J'ai vu qu'il y'a une vtable qui est crée pour chaque objet.
    Donc si j'ai 10 voitures, j'aurais 10 vtable ?
    Tu n'as pas besoin de connaitre cette information bas niveau pour l'instant.
    Et non. Tout objet ayant une fonction membre virtuelle à lui, ou héritée, dispose implicitement d'un pointeur vers vtable. Et il y a une vtable par classe (qui a des fonctions membre virtuelles), pas par objet (== instance de classe). Je ne sais plus s'il y a partage en l'absence de supplantation/redéfinition, je suppose que oui -- c'est dire à quel point c'est un détail inutile.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Salut Loic,

    Merci pour ta réponse très intéressante

    Citation Envoyé par JolyLoic Voir le message
    Si je comprends bien, tu ne veux pas savoir comment ça marche en terme de spécifications du langage
    euh, si, si tu as le temps, je suis toujours preneur, en plus vos explications sont très simples et très importantes pour moi, donc, je suis toujours preneur

    Le mécanisme est effectivement en général implémenté à l'aide de vtables.

    Il y a une vtable par classe (par par objet) qui contient des pointeurs sur les fonctions virtuelles.
    ça s'est une information très importante dans ce domaine, merci !

    CHaque objet lui possède un pointeur sur la vtable qui lui correspond.
    OK

    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
     
    class A
    {
      int i;
      virtual void f();
      virtual void g();
      void h();
    };
     
    class B : public A
    {
      int j;
      virtual void f();
      virtual void f2();
    };
    Un objet A ressemblera à :
    - Pointeur Vtable A
    - i

    Un objet B ressemblera à :
    - Pointeur Vtable B
    - i
    - j

    La Vtable de A ressemblera à :
    - Infos de RTTI
    - &A::f
    - &A::g

    La VTable de B ressemblera à :
    - Infos de RTTI
    - &B::f
    - &A::g
    - &B::f2
    OK merci pour cette explication.

    Ta réponse m'aide beaucoup à comprendre ce principe d'utilisation, je t'en remercie mille fois.

    beegees

    Citation Envoyé par Luc Hermitte Voir le message
    Il n'existe rien de tel en C++. Je suppose que tu veux parler de classes disposant de fonctions membre virtuelles, voire de classes abstraites.
    Exactement, autant être claire dans ce que l'on écris, encore faut-il savoir de ce que l'on parle, merci pour l'information.

    Tu n'as pas besoin de connaitre cette information bas niveau pour l'instant.
    euh, ok, s'est juste que j'aime bien aller au fond des choses, surtout en C++

    Et non. Tout objet ayant une fonction membre virtuelle à lui, ou héritée, dispose implicitement d'un pointeur vers vtable.
    Quand tu dis "Tout objet" tu veux dire "Toute classe" ?

    Et il y a une vtable par classe (qui a des fonctions membre virtuelles), pas par objet (== instance de classe).
    OK, tu dis le même que Loic, merci.

    Je ne sais plus s'il y a partage en l'absence de supplantation/redéfinition, je suppose que oui -- c'est dire à quel point c'est un détail inutile.
    euh, là, je ne comprends pas

    Merci encore à vous deux.

    beegees

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Oublie, j'avais dis une bétise -- j'avais zappé les infos de RTTI.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Oublie, j'avais dis une bétise -- j'avais zappé les infos de RTTI.
    Á quel niveau t'as dis une bétise ?

    S'est quoi RTTI ?

    Je vais aller voir sur

  9. #9
    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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Run-Time Type Information est un terme informatique utilisé pour signaler la capacité d'un langage de programmation à déterminer le type d'une variable lors de l'exécution d'un programme.
    Wikipedia
    "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)

  10. #10
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Wikipedia
    Un tout grand merci.

    beegees

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question sur les fonctions virtuelles
    Par Negatio dans le forum C++
    Réponses: 10
    Dernier message: 22/03/2013, 09h22
  2. Question sur les fonctions ORACLE
    Par Fakhry dans le forum SQL
    Réponses: 8
    Dernier message: 12/12/2006, 17h13
  3. [Dates] Question sur les fonctions Date
    Par cerede2000 dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2006, 17h26
  4. Réponses: 2
    Dernier message: 20/10/2006, 15h07
  5. Question sur les fonctions "send()" et "recv(
    Par damien99 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 20h47

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