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 :

Héritage, vecteurs, problème de type


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2003
    Messages : 69
    Par défaut Héritage, vecteurs, problème de type
    Bonjour,

    Si j'ai par exemple le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class A{...}
    class B : public A{...}
    Et que je crée un vecteur de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<A*> vect;
    Lorsque je crée un objet de type B :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    B* b = new B(...);
    Que je l'introduis dans le vecteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vect.puch_back(b);
    Et que je teste son type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("type : %s\n", typeid(vect[emplacement_de_b]).name())
    La console m'affiche :

    Pourquoi ? Pourquoi pas class B ? Et donc, comment faire pour détecter la présence d'une instance de la sous-classe B dans un vecteur de A ? Et comment forcer alors l'appel d'une méthode de B, qui surdéfinit une méthode de A ?

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Si ta methode est une methode virtuelle de A que tu redefinis dans B alors tu n'as pas besoin de connaitre le type reel : Lors de l'appel "monpointeur->DoSomething()" c'est DoSomething de A qui sera appelé pour des objets de type A, et DoSomething de B qui sera appelé pour les objets de type B. C'est tout l'interet du polymorphisme et des methodes virtuelles.

    Si ta methode est propre a B, il te faut utiliser un dynamic_cast pour decouvrir le type reel de l'objet sur lequel tu pointes (cf la FAQ sur les casts pour ca). A utiliser avec moderation (la encore cf la FAQ)...

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Salut,

    Poue le typeid il te renvoie le type du pointeur, et non pas le type de l'objet dérivé. Comme tu stocke tes objets sous forme de pointeur sur type de base, le type renvoyé sera le type de base.

    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typeid(*(vect[emplacement_de_b])).name();
    Plus d'infos ici

    Pour le fait d'appeler la méthode du bon type, il suffit que la méthode soit déclarée virtuelle :

    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 {
     
        virtual void uneMethode();
     
    };
     
    class B : public A {
     
        virtual void uneMethode();
     
    };
     
    A* a = new B();
    a->uneMethode //ici c'est B::uneMethode qui est appelée

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2003
    Messages : 69
    Par défaut
    Ok, merci beaucoup

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

Discussions similaires

  1. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  2. Problème de type chaîne
    Par champijulie dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 12/05/2005, 20h23
  3. Réponses: 4
    Dernier message: 30/01/2005, 14h23
  4. [Sybase] Problème de type sous ASE
    Par Hotchotte dans le forum Sybase
    Réponses: 1
    Dernier message: 18/12/2004, 11h04
  5. [héritage] cast avec le type de base
    Par Lere dans le forum C++
    Réponses: 6
    Dernier message: 16/09/2004, 18h21

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