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 :

petite question (type de retours covariants)


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 2
    Par défaut petite question (type de retours covariants)
    Bonjour,

    Je ne sais pas si le titre est bien choisi mais soit, quelqu'un pourrait t'il m'expliquer pourquoi ce code n'est pas accepté par le compilateur (la dernière ligne, il me dit que la conversion de A* vers B* est impossible). Le but est d'obtenir un pointeur du type dérivé à partir d'un pointeur du type de base, grace à une méthode virtuelle qui renvoie le pointeur this, et dont le type de retour dépend bien sur du type de l'objet.

    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
    {
    	private:
    		int a;
    	public:
    		virtual A* getThis() = 0;
    };
     
     
    class B : public A
    {
    	private:
    		int b;
    	public:
    		virtual B* getThis() {return this;}
    };
     
     
    int main()
    {
    	A* a;
    	B* b = new B;
    	a = b;
    	b = a->getThis();
    }
    Je sais qu'un dynamic cast résoudrait le problème, mais je voudrais savoir pourquoi cette méthode ci n'est pas correcte, vu qu'elle me semble bien foutue.

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Fais donc des recherches sur static_cast et dynamic_cast. Cela te permet de passer d'un pointeur vers une classe de base à un pointeur vers une classe dérivée.
    De plus, pour dynamic_cast, si la conversion est impossible, il retourne NULL.
    static_cast ne vérifie pour sa part rien, et effectue une conversion C-style.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par Jabawock Voir le message
    (...) je voudrais savoir pourquoi cette méthode ci n'est pas correcte, vu qu'elle me semble bien foutue.
    Et bien 'a' est de type 'A*' et donc 'a->getThis()' renvoit un 'A*' qui ne peut être affecté à une variable de type 'B*'...

    Si ça pouvait fonctionner il se passerait quoi avec une classe 'C' en tous points similaires à 'B' mais avec son 'getThis' qui renverrait un 'C*' ?
    L'appel 'a->getThis()' devrait renvoyer quoi selon toi ? un 'B*' ou un 'C*' ?

    MAT.

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Et imagines que B hérite à la fois de A1 et A2. C'est horrible de faire ça implicitement. (ça = conversion A1* -> B* ou A2* -> B*)

    Il y a bien des cas, par exemple celui de Mat, où cela serait tellement ambigü, voir "incorrect", qu'il est normal ne devoir spécifier explicitement les détails de la conversion.

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 2
    Par défaut
    Ouais pour les cast je sais comment ils fonctionnent et ça fonctionnerait très bien mais je voulais pas trop les utiliser (pas tres propre), et en plus je croyais avoir une bonne idée.
    Je suis bien conscient que cette méthode peut produire des résultats abérants mais dans mon cas je comptais l'utiliser uniquement en étant 100% sur du résultat (du type véritable de l'objet pointé), et m'en sortir avec des erreurs à l'éxecution dans le pire des cas.

    Sinon, Mat: tu dis que a->getThis va renvoyer un objet de type A*, mais c'est bien pour ça que je déclares =0 la méthode getThis dans A, en espèrant être redirigé vers le getThis de B. Et dans ton exemple, la classe C ne change rien vu que l'objet pointé reste un B et donc c'est la méthode getThis dans B qui devrait être appelée.

    Merci pour ces réponses en tout cas!

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Si j'ai bien compris, tu ne parles plus de virtualité mais de surcharge là.

    LA solution pour faire ce que tu veux, c'est le downcast.
    static_cast si t'es sur du type, dynamic_cast sinon.
    static_cast ne coûte rien. Pourquoi ne pas t'en servir ?

    Il me semble que la FAQ parle de tout ça, à vérifier.

  7. #7
    screetch
    Invité(e)
    Par défaut
    Si le code est bien redirige vers B->getThis(), par contre le compilo ne peut pas savoir si c'est redirige vers celui de B ou un autre. Le principe de la methode virtuelle c'est que tu recois un truc qui est AU MOINS un A (ca PEUT etre plus mais ca PEUT etre un A) donc tu ne peux pas speculer sur le fait que c'est un B aussi.

    Si tu commences a caster parce que tu es sur aue c'est un B c'est que tu aurais du passer directement un B a la fonction, c'est BIEN plus sur =)

Discussions similaires

  1. Petite question sur les types.
    Par carlesup3 dans le forum Caml
    Réponses: 8
    Dernier message: 07/07/2012, 19h43
  2. Réponses: 1
    Dernier message: 04/02/2011, 01h29
  3. Petite question d'orientation insertion balises type Bbcode
    Par Sianobel dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/04/2010, 00h47
  4. petite question sur les types de champs
    Par charlie koller dans le forum Débuter
    Réponses: 2
    Dernier message: 21/02/2007, 17h57
  5. Type void * ... petite question !
    Par Franck.H dans le forum C
    Réponses: 29
    Dernier message: 28/03/2005, 13h38

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