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 :

Question sur l'héritage (débutant en C++)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut Question sur l'héritage (débutant en C++)
    Bonjour tout le monde,

    J'ai une classe Rectangle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class CRectangle : public CForme 
    Voici CForme :
    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 CForme
    {
    public:
    	CForme();
    	CForme(const CForme& Source);
    	CForme(const char* UnNom);
    	~CForme();
     
    	bool				EstValide() const;
     
    	const char*			Nom() const;
    	double				Surface() const;
     
    	bool				Nom(const char* UnNom);
     
    private:
    	CChaine				m_Nom;
    };
    - Est-ce que CRectangle hérite de toutes les méthodes de CForme ?
    - Même des private ?
    - N'importe où dans le code ?

    Comment appeler une méthode de CForme dans CRectangle ?

    Je vous remercie d'avance pour votre aide.

    beegees

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    La classe CRectangle permet d'accéder de manière publique à tout ce qui est public de CForme.

    En local (donc, au sein d'une méthode propre de CRectangle), tu peux accéder aux méthodes et aux membres publics et protegés de CForme.

    Par contre, tout ce qui est privé dans CForme n'est accessible que par les méthodes de CForme (quel que soit la visibilité de la méthode qui essaye d'y accéder).

    Ainsi, de manière général, avec une classe de base du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Base
    {
        public:
           void methodePublique();
           int membrepublic;
        protected:
           void methodeProtegee();
           int membreprotege;
        private:
           void methodePrivee();
           int membreprive;
    };
    et une classe dérivée du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Derivee : public Base
    {
        public:
            void methodeDeriveePublique();
             int membrederivePublic;
        protected:
             void MethodeDeriveeProtectee();
             int membrederiveprotege;
        private:
             void methodeDeriveePrivee();
             int membrederivepublic;
    };
    et une déclaration de variable du genre de
    tu pourras accéder directement à
    • obj.methodePublique()
    • obj.methodeDeriveePublique()
    • obj.membrepublic
    • obj.membrederivepublic

    Au sein des méthode de Derivee, tu peux accéder
    • à tous les membre et méthodes de la classe Derivee
    • à methodeProtegee() et
    • à membreprotege

    Mais seuls les méthodes
    • methodePublique
    • methodeProtegee et
    • methodePrivee

    pourront accéder à membreprive

    Maintenant, ce n'est valable que dans le cadre d'un héritage public.

    En effet, tu peux provoquer un héritage protege ou même privé, et, dans ce cas, la visibilité maximale des différents éléments de la classe de base ne sera que celle de l'héritage.

    Ainsi, avec une classe du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Derivee2: protected Base
    {
       /*...*/
    };
    meme les méthodes et membres publics de Base deviendront protected (et donc accessible seulement depuis les méthodes de Derivee2)

    Pär contre, les membres et méthodes privés de Base resteront inaccessible depuis les méthodes de Derivee2

    Le principe étant le même dans le cadre d'un héritage privé

    Pour appeler une méthode de ta classe de base dans ta classe dérivée, deux situations peuvent exister:

    La méthode à appeler n'est pas redéfinie dans la classe dérivée.

    Il suffit alors de l'appeler de manière classique (en prenant en compte la visibilité: methodePrivee() ne serait donc pas accessible depuis les méthodes de Derivee )

    Le code peut donc être tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void Derivee::methodeDeriveePublique()
    {
        methodePublique(); 
        /* ou */
        methodeProtegee();
    }
    Le deuxième cas est que la méthode est redéfinie dans la classe dérivée.

    Elle est alors déclarée comme méthode virtuelle au sein des deux classes.

    Pour appeler explicitement le comportement de la classe de base, il faut indiquer au compilateur que c'est ce que tu veux, en fournissant la portée réelle de la fonction:

    ainsi, avec un héritage de l'ordre de
    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
    class Base2
    {
        public:
            // une fonction dont le comportement varie en fonction du type réel
            virtual void methodeVirtuelle();
    };
    class Derivee3: public Base2
    {
        public:
            //pour pouvoir redéfinir le comportement, il faut redéclarer la méthode
            virtual void methodeVirtuelle();
            //et une autre méthode pour montrer le fonctionnement
            void laMethode();
    };
     
    void Derivee3::laMethode()
    {
        //ici, on appelle le comportement défini pour Derivee3
        methodeVirtuelle();
        //et ici, on appelle le comportement défini pour la classe de base
        Base2::methodeVirtuelle();
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Salut Koala,

    Woaw, quelle magnifique réposne Merci.

    Je relis ça à mon aise et je reviens très vite.

    Merci encore.

    beegees

  4. #4
    Membre confirmé
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Par défaut
    N'est-il pas possible de rentre les methodes privées accessibles avec les classes friend?

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    si, de fait, je n'ai pas parlé de l'amitié...

    Voilà la preuve qu'il reste toujours difficile d'être exhaustif
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Citation Envoyé par koala01 Voir le message
    si, de fait, je n'ai pas parlé de l'amitié...

    Voilà la preuve qu'il reste toujours difficile d'être exhaustif
    Bonjour Koala,

    Je viens de terminer quelques tests sur l'héritage et malheureusement, ce que je pensais correct me semble incorrecte.

    L'héritage a bien pour but de taper des fonctions afin qu'elles puissent être utilisées par des objets d'autres classes qui ont en commun des objets qui utiliseront ces fonctions ? On les tape alors qu'une seule fois les fonctions.

    J'ai fais un test en créant une classe Personne.

    Une personne a comme caractéristiques (que ça soit un garçon ou une fille) un nom, un prénom et un âge.

    J'ai donc créé ma classe comme ceci dans un fichier .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class CPersonne
    {
    public:
    	CPersonne();
    	CPersonne(const char* Nom,const char* Prenom,int Age);
    	~CPersonne();
     
    	bool			Nom(const char* UnNom);
    	bool			Prenom(const char* UnPrenom);
    	bool			Age(int UnAge);
    };
    J'ai ensuite créé une classe CGarcon en me disant que si je ne tape que ça... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class CGarcon : public CPersonne
    {
    
    	
    };
    ...Je pourrais créer dans le main une variable de type CGarcon nommée par exemple Eric et qu'ensuite, je n'aurais qu'à taper :

    Eric. et là les fonctions auraient apparûes.

    Ce n'est pas le cas, y'a-t'il quelque chose que je n'ai pas compris ?

    Est-ce que ma logique est correcte au niveau de l'héritage ?

    Merci d'avance pour votre aide.

    beegees

Discussions similaires

  1. Questions sur l'héritage multiple
    Par beegees dans le forum C++
    Réponses: 12
    Dernier message: 31/03/2008, 17h01
  2. petite question sur l'héritage et les cast
    Par baedal dans le forum Langage
    Réponses: 3
    Dernier message: 29/02/2008, 00h48
  3. Questions sur l'héritage dans Matisse
    Par Cassios dans le forum NetBeans
    Réponses: 8
    Dernier message: 14/03/2007, 23h23
  4. Question sur X11 - Xlib - Débutant
    Par bsp_epoto dans le forum Linux
    Réponses: 1
    Dernier message: 26/07/2006, 18h02
  5. Question sur l'héritage
    Par the big ben 5 dans le forum Delphi
    Réponses: 28
    Dernier message: 06/06/2006, 17h27

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