Téléchargement
illégal
Posez votre question Signaler

Heritage en c++ : pb de private

pom - Dernière réponse le 8 août 2008 à 16:19
Bonjour, je suis en train de potasser l'héritage de classe en c++ J'ai malheureusement un pb de private.
Je me suis fais un exemple tout bete pour apprendre à manipuler les private, protected et public

voici mon exemple

enum Race{race1,race2,race3};

class Animal
{
private:
Race race;

protected:
int age;
int poids;

public:
Animal():age(0), poids(0), race(race1) {cout<<"\nAppel du constructeur par defaut de Animal\n";}
Animal(int _a,int _p,Race r): age(_a), poids(_p), race(r) {cout<<"\nAppel du constructeur de Animal(int,int,Race)\n";}
~Animal() {cout<<"\nAppel du destructeur de Animal\n";}

puis j'ai codé d'autre fonctions membre
};

class Mamifere:public Animal
{
int patte; // nombre de pattes

public:
Mamifere():Animal(),patte(0),race(race1) {cout<<"\nAppel du constructeur par defaut de Mamifere\n";}
Mamifere(int a,int b,Race r,int c):Animal(a,b,r),patte(c) {"\nAppel du constructuer Mamifere(int,int,Race,int)\n";}
~Mamifere() {cout<<"\nAppel du destructeur de Mamifere\n";}

et il y a d'autres fonctions membre
};

mon pb vient du fait que dans le constructeur par defaut de Mamifere, race est private. La solution "facile" consiste à tout mettre en protected mais j'aimerais apprendre à manipuler les private, protected et public. Je ne voudrais qu'il n'y a que age et poids qui puissent se transmettre mais pas race.

Comment puis-je faire ?

Merci bcp
Pom
Lire la suite 

Heritage en c++ : pb de private »

Suggestions
9 réponses
Réponse
+0
moins plus
j'ai trouvé, j'ai transformé mon constructeur par défaut de Mamifere par

Mamifere():Animal(0,0,race1),patte(0) {cout<<"\nAppel du constructeur par defaut de Mamifere\n";}

pom
Ajouter un commentaire
Réponse
+0
moins plus
un attribut private ne peut etre utilise que par la classe a laquelle il appartient donc pour acceder au element private
il faut declare une fonction public generalement appelle getAttribut qui retourne l'attribut private en gros tu dois faire

Race getRace()
{return(this.race);
}
ces methodes son appelees des accesseurs
voila
Ajouter un commentaire
Réponse
+0
moins plus
les classes filles ne peuvent pas modifier les attributs des classes parents declaré en private ???
Ajouter un commentaire
Réponse
+0
moins plus
en fait non les classes heritieres peuvent acceder au protected seulement
(je travaille sur des souvenirs la c'est a verifier :) )

pour modifier un attribut privée on utilise une fonction publique
setAttribut(new_val)
{ this.attribut=new_val;
}
NoSFe- 25 juin 2004 à 17:05
Race Animal::getRace()
{ return (this.race);
}
pom - 28 juin 2004 à 10:33
bonjour tafiscobar, bonjour NoSFe.
Merci encore pour votre aide.
J'ai trouvé une solution en mixant vos deux propositions.

Tafiscobar, ma fonction get_race() est publique. NoSFe, c'est
Race Animal::getRace()
{ return (this->race);
}
et non this.race. Mais de toute manière return race; fonctionne aussi.

Par contre quand je fais

friend std::ostream & operator<<(std::ostream & os, const Mamifere & mam) {os<<"\nage = "<<mam.age<<" poids = "<<mam.poids<<" race = "<<mam.get_race()<<" patte = "<<mam.patte<<endl; return os;}

j'obtiens :

error: passing `const Mamifere' as `this' argument of `Race Animal::get_race()' discards qualifiers

en revanche, que je supprime le const de const Mamifere & mam

ca marche super bien.

Savez-vous pourquoi ?

merci encore
pomme
Behall- 8 août 2008 à 16:19
houla la question date un peu ... En fait les méthodes qui ne sont pas déclarées const comme ceci

Race Animal::get_race() const
{ .. }

ne peuvent pas être appelées sur une instance const (même un mammifère) comme dans ton exemple.

A priori une méthode qui n'e'st pas signalée const est considérée comme modifiant potentiellement son objet et l'appeler sur un objet ou une référence (ou un pointeur sur) const est interdit.
Ajouter un commentaire
Ce document intitulé « heritage en c++ : pb de private » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?