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 :

Objet d'un type initialisé avec un autre type.


Sujet :

C++

  1. #1
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut Objet d'un type initialisé avec un autre type.
    Salut!

    J'ai vu à plusieurs reprise dans la FAQ C++
    ( http://c.developpez.com/faq/cpp/?pag...urs_covariants
    http://c.developpez.com/faq/cpp/?pag...UCTEUR_virtuel )
    ce type de déclaration:

    où B dérive de A.

    1)Quel est l'intérêt de cette notation?
    En effet il est inutile de déclarer "a" comme "new B" puisque son type est A
    et donc il ne possède pas les attributs de B.
    Ce "tronquage" d'attribut n'est-ce pas du slicing?

    2)Pourquoi pas un simple:
    Merci de m'éclairer.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    C'est le principe même du polymorphisme d'héritagle.. Ce n'est plus par rapport au type de la variable qu'on sait ce qu'il faut appeler, mais par rapport à l'objet réel qui est derrière.
    Citation Envoyé par La FAQ C++
    Dans cet exemple, F1() est redéfinie statiquement par B, c'est à dire que le compilateur utilise le type officiel de la variable pour savoir quelle fonction appeler. Ainsi, si on appelle F1() depuis un objet de type A, ce sera toujours A::F1() qui sera appelé, et si l'objet est de type B ce sera B::F1() indépendamment du fait qu'il peut s'agir d'un pointeur ou d'une référence sur A qui désigne en réalité un objet de type B (cas d'utilisation polymorphique de B).
    http://c.developpez.com/faq/cpp/?pag...NITION_virtual

    Tu pourrais imaginer avoir un tableau de A et d'appeler des méthode print() par exemple qui écrivent des choses différentes selon qu'elles sont des A où des dérivés
    Fiquet
    - FAQ SDL
    - FAQ C++

  3. #3
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Oui mais quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A{
    public:       int x;
           };
     
    class B:public A{
    public:       int y;
           int z;
           };
     
    int main()
    {
        A * a = new B; 
        a->y=0; //ligne 62
    Le compilo,à juste titre,m'indique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    62 C:\DOCUME~1\PROPRI~1\Bureau\main_test.cpp 'class A' has no member named 'y'
    Donc quel est l'interêt de déclarer "a" en tant que objet de type B si il n'en possède pas les attributs supplémentaires:"y" et "z"?

    On sait déjà que B dérive de A donc implique que "a" est aussi de type A.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    je vais te proposer un exemple

    Imagine un vehicule! Tu sais qu'il doit avancer mais tu ne sais pas comment car c'est lié au type précis de vehicule, donc tu as cette classe la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    classe Vehicule
    {
    public:
             virtual void avancer();
    };
    mmaintenant tu as un velo et une voiture (par exemple) qui sont des vehicule. Tu as donc cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    classe Voiture : public vehicule
    {
    public:
          void avancer();
    };
     
    classe Velo: public vehicule
    {
    public:
          void avancer();
    };

    maintenant tu arrive à un moment dans ton programme ou tu as besoin d'un vehicule pour avancer : tu t'en fous duquel tu as donc ca :
    puis un peu plus loin tu apprends que ce vehicule est une voiture tu as donc ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ve = new Voiture();
    et quand tu feras

    ca appeleras la methode avancer de la classe voiture

    pour ton erreur c'est parce que A ne connait pas y : ca revient a dire (pour notre exemple) qu'un vehicule ne sait pas quel est la puissance de son moteur (car il n'est pas obligé d'avoir un moteur)

    voila j'espere etre clair
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  5. #5
    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'rajouterai juste que, lorsque l'on utilise le polymorphisme d'héritage, notre hiérarchie de classes doit être polymorphique, cad qu'elle doit permettre le polymorphisme...
    En général, cela se traduit par des fonction virtuelles/surchargées.

  6. #6
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    hiko-seijuro:Merci pour ton exemple je perçoit mieux la notion de polymorphisme d'héritage.


    pour ton erreur c'est parce que A ne connait pas y : ca revient a dire (pour notre exemple) qu'un vehicule ne sait pas quel est la puissance de son moteur (car il n'est pas obligé d'avoir un moteur)
    Donc on perd les attributs de la classe voiture!
    On n'a que accés à la méthode "avancer".

    Donc un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture *ve=new Voiture;
    est mieux.

    J'ai dû mal à voir l'intérêt du polymorphisme d'héritage.

    Auriez vous un exemple où celui ci est nécessaire et où on garderait les attributs de chaque classe?

    Merci.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    bah oui et non !!


    tu sais que tu as besoin d'un vehicule à un instant t mais tu ne sait pas encore quel type de véhicule
    (en gros tu sais avancer mais pas comment) et c'est seulement plus tard que le type va se decider dynamiquement bah la c utile
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  8. #8
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Donc dans les exemples tirés de la FAQ l'utilisation du polymorphisme d'héritage est bidon puisque on connait le type précis de l'objet à sa déclaration?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Le gros principe de l'héritage public, c'est que les objets des classes filles peuvent être utilisés là où l'on attend un objet du type parent. (google/recherche avancée -> LSP)

    Ce qui compte dans la fonction qui attend un objet du type parent, c'est ce que l'on peut faire avec le parent. Pas ce que l'on peut faire avec les enfants. On s'en fout.

    Quand tu écris tes idées, tu te fiches de savoir si tu écris avec un stylo plume, un crayon, ou un clavier. Ce qui compte c'est que tu as écris des phrases. Juste au début, tu choisis avec quoi tu vas coucher tes pensées (terminologie info, le choix passe via une "factory"). Après, tu couches tes pensées avec une chose qui permet de le faire. Le processus est toujours le même. Pensées -> phrases -> mots -> signes -> couchage de signes. L'élement retenu (stylo/kbd/...) va s'occuper lui du "couchage de signes". L'algo complet se fiche de savoir quel est l'objet exact utilisé. Il sait juste que l'objet fournit le service "coucher_signe(signe)".


    Et oui, les exemples de la FAQ font du condénsé. Imagine que tu as un switch (factory rudimentaire), où seront réalisées l'allocation et l'affectation.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    merci luc j'arrivai plus à m'expliquer :d
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  11. #11
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Je commence à mieux cadrer les principes du polymorphisme d'héritage.

    Ce qui compte dans la fonction qui attend un objet du type parent, c'est ce que l'on peut faire avec le parent. Pas ce que l'on peut faire avec les enfants. On s'en fout.
    Donc le polymorphisme d'héritage est limité.

    N'existe t'il pas un moyen d'en faire et au moment de la "précision"(voiture ou vélo) de l'objet pouvoir utiliser les attributs supplémentaires de cet objet(moteur ou pas)?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  12. #12
    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
    Si.
    Fais une recherche sur le Downcasting sur le forum.
    EDIT : http://c.developpez.com/faq/cpp/?rechercher=downcast

  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Le downcasting est 90% du temps la preuve d'une erreur de design. Ici cela le serait.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  14. #14
    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
    En effet. Je confirme.
    Nombreux sont les cas que j'ai vus où la personne avait en effet fait une erreur de design. En fait, tous, je crois.
    Il y a toujours mieux : genre utiliser le PImpl au lieu d'hériter, utiliser une liste de au lieu d'hériter, pleins de choses de ce genre.
    Donc dans le cas ou l'on a besoin de faire quelque chose de spécifique à UNE des classes filles dans un code polymorphique, c'est que le code ne doit pas être polymorphique ... donc problème. CQFD

  15. #15
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    hiko-seijuro très bon exemple!

  16. #16
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Merci de toute vos réponses.

    Donc le downcasting est l'inverse du slicing:
    on rajoute des caractéristiques à l'objet au lieu d'en tronquer.

    Donc si j'ai bien compris le polymorphisme d'héritage sert à manipuler des objets dont seulles nous interresse les méthodes mais où ses particularités n'ont aucune importance.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  17. #17
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par seriousme
    Donc le downcasting est l'inverse du slicing:
    on rajoute des caractéristiques à l'objet au lieu d'en tronquer.
    le downcasting est plutôt l'inverse du upcasting.
    Le slicing c'est autre chose, c'est créer une copie tronquée d'un objet, alors que le downcasting ne fait que réévaluer le type d'un même objet (l'objet pointé par A *a est en fait un B). On ne rajoute pas de caractéristiques à un objet existant, car cet objet les possède déjà. On fait juste en sorte d'y accéder.

    Après y'a 2 types d'héritage : structurel (les données membres) et comportemental (les fonctions). C++ mélange les 2.
    Mais en gros dans le cas de la virtualité, c'est plutôt le 2° qui intervient. La classe de base sert à définir un contrat (les fonctions virtuelles) = une interface générale commune à toutes les classes de base. Les classes filles implémentent ce contrat, ce qui permet au code client de les utiliser sans même savoir que ces classes de base existent.
    Pour reprendre l'exemple, le client va manipuler la classe Voiture sans même savoir qu'il s'agit en fait de la classe RenaultClio ou Peugeot207.

  18. #18
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    On ne rajoute pas de caractéristiques à un objet existant, car cet objet les possède déjà
    pas vraiment:
    quand on fait:
    l'objet pointé par "ve" n'a QUE les caractéristiques de la classe vehicule.

    puis:lui en rajoute vraiment:moteur par exemple.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  19. #19
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Non. Quand on fait il n'y a aucun objet pointé par ve.

  20. #20
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    je dirait plutot que pour

    tu signales que tu as besoin d'un vehicule !

    et avec ca :

    tu indique que le vehicule est en fait une voiture
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/04/2019, 18h52
  2. Réponses: 0
    Dernier message: 24/11/2014, 08h52
  3. caster type Object en un autre type
    Par CaptainCyd dans le forum Langage
    Réponses: 4
    Dernier message: 18/09/2007, 14h47
  4. Réponses: 2
    Dernier message: 23/04/2007, 00h41
  5. Connaitre type d'un fichier (<input type="file"..>) avec javascript
    Par goldorax113 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/04/2006, 09h00

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