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 :

Mixer du virtuel et non-virtuel dans une sous-classe


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut Mixer du virtuel et non-virtuel dans une sous-classe
    Bonjour,

    J'ai une question de debutant: je voudrais tirer avantage du polymorphisme mais aussi avoir des fonctions specifiques dans mes sous-classes derivees de classe abstraite. Comment faire ?

    Voici un 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
     
    #include <iostream>
    using namespace std;
     
    //A is 
    class A {
    public:
    	A() {}
    	virtual void print() = 0; 
    };
     
    class B : public A {
    protected:
    	int b;
    public:
    	B() : A() {}
    	void print() { cout << "I am a B" << endl;}
    	void setb(int n) {b = n;}
    };
     
    int main(int argc, char** argv) {
    	A* objb = new B();
     
    	objb->print();
    	objb->setb(3); //error! 'class A' has no member named 'setb'
    }
    Je pourrais mettre setb en virtuel dans la classe abstraite, mais ca n'aurait pas beaucoup de sens: setb est une fonction qui change b, specifique de la classe B, ca ne devrait pas faire partie de l'interface fournie par A. Ou alors je pourrais creer B comme un B* objb, mais je perdrais le polymorphisme sur print(). Comment fait-on pour ajouter a une interface des fonctions specifiques a mes sous-classes?

    Merci d'avance.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour,
    tu utilise un dynamic_cast
    http://cpp.developpez.com/faq/cpp/?p...s#DIVERS_casts
    pour convertire ton pointeur (ou reference) de A en B. Bien sur il y as une gestion d'erreur associé si le cast est impossible( exeption avec les reference et pointeur à 0 pour les pointeur)
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc, char** argv) {
    	A* pObj = new B();
           pObj ->print();
           B * pB = dynamic_cast<B*>( pObj  );
           if (pB==0)   pB ->setb(3); 
     
    }

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Bonjour,
    tu utilise un dynamic_cast
    http://cpp.developpez.com/faq/cpp/?p...s#DIVERS_casts
    pour convertire ton pointeur (ou reference) de A en B. Bien sur il y as une gestion d'erreur associé si le cast est impossible( exeption avec les reference et pointeur à 0 pour les pointeur)
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc, char** argv) {
    	A* pObj = new B();
           pObj ->print();
           B * pB = dynamic_cast<B*>( pObj  );
           if (pB==0)   pB ->setb(3); 
     
    }
    OK, merci beaucoup, c'est la ou le dynamic cast peut jouer son role.
    Pour autant, est-ce que mon design (A est la classe de base abstraite, je derive une sous-classe et rajoute des fonctions et attributs specifiques, et ensuite j'utilise le dynamic cast pour beneficier a la fois du polymorphisme et de ces specificites) est habituel ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    A ma connaissance oui.

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup pour ces infos.

  6. #6
    Membre averti Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    A ma connaissance oui.
    Ou pas.

    Le dynamic cast est a proscrire si l'appli a besoin de performances, car cela oblige a utiliser le RTTI, qui a un cout non négligeable.

    Au passage, ça reste a proscrire dans les autres appli car c'est souvent mal utilisé, ou inutile ( on peut faire autrement).

    Question de point de vue sur comment programmer, j'imagine.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Kujara Voir le message
    Ou pas.

    Le dynamic cast est a proscrire si l'appli a besoin de performances, car cela oblige a utiliser le RTTI, qui a un cout non négligeable.

    Au passage, ça reste a proscrire dans les autres appli car c'est souvent mal utilisé, ou inutile ( on peut faire autrement).

    Question de point de vue sur comment programmer, j'imagine.
    Un autre avis
    Dans ce cas, comment resoudre le probleme que j'ai souleve: je veux pouvoir utiliser le polymorphisme en utilisant un pointeur de la classe de base et appeler les fonctions virtuelles. Mais mes classes derivees ont, en plus, des attributs ou fonctions specifiques et non virtuelles. Comment ca se gere ?

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Je me reponds a moi-meme: peut-etre que je prends le probleme a l'envers. Peut-etre faut-il utiliser le run-time binding et le polymorphisme que lorsque c'est necessaire, et utiliser un pointeur de la sous-classe en "temps normal", quand je veux utiliser les specificites de cette classe. C'est ca?

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/07/2019, 09h42
  2. Table non reconnue dans une sous requête
    Par hammag dans le forum SQL
    Réponses: 10
    Dernier message: 03/10/2012, 11h53
  3. Lire la valeur d'une variable dans une sous-classe de Script
    Par professeur shadoko dans le forum Groovy
    Réponses: 1
    Dernier message: 31/08/2012, 10h07
  4. utiliser "this" dans une sous classe
    Par lucke_widness dans le forum Qt
    Réponses: 1
    Dernier message: 20/01/2010, 16h53
  5. Réponses: 4
    Dernier message: 14/02/2005, 19h41

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