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

Langage C++ Discussion :

down cast avec static_cast


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 50
    Par défaut down cast avec static_cast
    Bonjour,
    Pourriez-vous m’expliquer pourquoi j'ai accès à la fonction fct() depuis pd ?
    J'ai pensé avoir une erreur à la compilation mais ce n'est pas le cas
    Voici mon code :
    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
     
    class Base {};
    class Derived: public Base 
    { 
        int a; 
        public :
        void fct() { cout << "Fct Derived" << endl; }
    };
     
    int main () 
    {
            Base * pb = new Base;
            Derived * pd;
     
            pd = static_cast<Derived*>(pb);  //pd cast Base en Derived 
            pd->fct();
     
        return 0;
     
    }
    Réponse :
    Fct Derived

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    parce que vue la trivialité du code, le compilateur a très certainement pris des largesses.
    Un tel code devrait crasher à l'exécution.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 50
    Par défaut
    Eben non, il ne plante pas à l’exécution.
    Résultat :
    Peut être parce que je ne manipule rien dans fct !

    Que veux-tu dire avec "trivialité du code" ?

    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par nirvo_ca Voir le message
    Que veux-tu dire avec "trivialité du code" ?
    Tout simplement parce que "this" n'est pas utile dans fct, fct ressemble à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void fct(Derived* _this) {
        cout << "Fct Derived" << endl;
    }
    Je suis sur que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main () {
        Derived* pd = reinterpret_cast<Derived*>(nullptr);
        pd->fct();
     
        return 0; 
    }
    S'exécute sans erreur.

    edit : cas un peu particulier de l'héritage : pas de fonction virtuelle, donc pas de vtable -> nullptr pourra être un pointeur sur "Derived" "valide" pour cette fonction.

    re-edit : l'appel de fonction à très certainement aussi été inliné, pour au final te retrouver avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main () {
        Base* pd = new Base;
        cout << "Fct Derived" << endl;
     
        return 0; 
    }

  5. #5
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Par défaut
    Citation Envoyé par nirvo_ca Voir le message
    Bonjour,
    Pourriez-vous m’expliquer pourquoi j'ai accès à la fonction fct() depuis pd ?
    J'ai pensé avoir une erreur à la compilation mais ce n'est pas le cas
    Il n'y a pas de raison qu'il y ait une erreur à la compilation. Vous dites au compilateur qu'il est légal d'appeler fct à partir d'un objet Derived, puis vous appelez fct à partir d'un objet Derived. En l'occurrence, l'objet Derived est construit illégalement à partir d'un objet Base, ce que l'ordinateur aurait indiqué comme une erreur si vous ne lui aviez pas fermé son clapet par un static_cast aussi autoritaire que faux. Il ne peut que s'incliner (en maugréant probablement ).
    Quant au fait que cela s'exécute comme s'il n'y avait pas d'erreur, c'est comme le code de la route: ce n'est pas parce que vous roulez à 170 sur l'autoroute que votre disque dur s'efface obligatoirement. Attention, annuler l'alarme sonore de votre GPS par un static_cast n'assure cependant pas que vous n'aurez pas d'accident grave la prochaine fois (par exemple en cas de traffic dense ou de données membres dans la classe dérivée).

Discussions similaires

  1. down cast avec chaîne de caractère
    Par g0up1l dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 25/03/2007, 11h46
  2. Problème de cast avec l'outil de génération de requetes VS2005
    Par rabddoul dans le forum Accès aux données
    Réponses: 1
    Dernier message: 22/02/2007, 13h19
  3. Cast avec un vector
    Par backus dans le forum Langage
    Réponses: 9
    Dernier message: 11/04/2006, 13h10
  4. Problème Cast avec NULL values
    Par WwiloO dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/10/2005, 10h49
  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