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 :

Savoir si la classe d'une instance hérite d'une autre classe


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut Savoir si la classe d'une instance hérite d'une autre classe
    Bonjour,

    Je cherche un moyen pour déterminer si la classe à laquelle appartient une instance est issue d'une classe parente donnée.

    Exemple : Soit une classe de base nommée Vehicule.
    Deux enfant en héritent : QuiRoule et QuiVole.
    Moto et Voiture héritent de QuiRoule.
    Avion hérite de QuiVole.

    J'ai un conteneur de Vehicule*, dont le contenu est composé d'instances de Moto*, Voiture* et Avion*.
    Je veux parcourir ce conteneur en filtrant sur les instances dont le type est hérité de QuiRoule.
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <iostream>
    #include <vector>
     
    class Vehicule
    {
        virtual void f() = 0;
    };
     
    class QuiRoule: public Vehicule
    {
        virtual void f() = 0;
    };
     
    class Voiture: public QuiRoule
    {
        void f() {}
    };
     
    class Moto: public QuiRoule
    {
        void f() {}
    };
     
    class QuiVole: public Vehicule
    {
        virtual void f() = 0;
    };
     
    class Avion: public QuiVole
    {
        void f() {}
    };
     
     
    int main()
    {
        std::vector<Vehicule*> v;
        v.push_back(new Moto());
        v.push_back(new Avion());
        v.push_back(new Voiture());
     
        for (size_t i = 0; i < v.size(); ++i)
        {
            if (typeid (*v[i]) == typeid (QuiRoule)) // ne marche pas, bien évidemment
            {
                std::cout << "v[" << i << "]" << " est un véhicule qui roule" << std::endl;
            }
        }
        return 0;
    }
    Pour résumé, je cherche quelque chose qui ressemblerait à un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeid(*v[i]) == ANY_SUBCLASS(typeid(QuiRoule))
    ou encore le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isinstance(mon_objet, ClasseParente)
    utilisé par les pythonistes :-).

    Merci
    <3 Debian
    [ C | C++ | PHP | Python ]

  2. #2
    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 860
    Points
    11 860
    Par défaut
    Tester le résultat de dynamic_cast successifs ne te conviendrait pas ?

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Oh.

    Merci pour cette réponse rapide, ça marche impec :-)
    <3 Debian
    [ C | C++ | PHP | Python ]

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Je pense que la solution la plus élégante est encore les fonction virtuelles dans ce cas

  5. #5
    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
    Citation Envoyé par Alp Voir le message
    Tester le résultat de dynamic_cast successifs ne te conviendrait pas ?
    Pourquoi successif ? Un seul dynamic_cast suffit ici.
    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.

  6. #6
    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 860
    Points
    11 860
    Par défaut
    J'ai dû mal comprendre dans ce cas

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/05/2009, 19h00
  2. Réponses: 3
    Dernier message: 08/02/2008, 10h23
  3. Réponses: 4
    Dernier message: 04/12/2007, 19h35
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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