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
    Membre Expert
    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 : 39
    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
    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.

  2. #2
    Membre �m�rite

    Homme Profil pro
    �tudiant
    Inscrit en
    Mars 2005
    Messages
    634
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    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

  3. #3
    Membre Expert
    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 : 39
    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
    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.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    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 :
    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

  5. #5
    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
    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
    Membre Expert
    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 : 39
    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
    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
    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.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    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

  8. #8
    Membre Expert
    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 : 39
    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
    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?

  9. #9
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    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 : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par d�faut
    merci luc j'arrivai plus � m'expliquer :d

  11. #11
    Membre Expert
    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 : 39
    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
    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)?

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

  13. #13
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    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 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
    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 �clair� Avatar de vdumont
    Profil pro
    �tudiant
    Inscrit en
    F�vrier 2006
    Messages
    510
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : Canada

    Informations professionnelles :
    Activit� : �tudiant

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

  16. #16
    Membre Expert
    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 : 39
    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
    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.

  17. #17
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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
    Membre Expert
    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 : 39
    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
    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.

  19. #19
    Membre �m�rite 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
    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 : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    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

+ 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