Rechercher : dans
Par :

Heritage en c++ : pb de private

Dernière réponse le 8 aoû 2008 à 16:19:03 pom, le 25 jun 2004 à 16:40:00 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « heritage en c++ : pb de private » dans :
[Optimisation] Polymorphisme “statique” Voir* Le polymorphisme est l'une des pierres angulaires du paradigme objet En C++, il s'exprime sous la forme de fonctions virtuelles : celles-ci permettent d'adapter dynamiquement (i.e. à l'exécution) leur code au type de l'objet auxquelles elles sont...
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
3D Secure / Verified by Visa / SecureCode: Qu'est-ce que c'est ? VoirDepuis octobre 2008, les banques et commerçants en ligne ont commencé à adopter le système 3DSecure pour les paiements sur Internet. Qu'est-ce que c'est ? 3DSecure est appelé "Verified by Visa" chez Visa, et "SecureCode" chez Mastercard. (Les logos...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Les classes en langage C++ VoirLa notion d'objet Le langage C est un langage procédural, c'est-à-dire que c'est un langage permettant de définir des données grâce à des variables, et des traitements grâce aux fonctions. L'apport principal du langage C++ par rapport au...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...

1

pom, le 25 jun 2004 à 16:46:14

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

Répondre à pom

2

NoSFe, le 25 jun 2004 à 16:46:44

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

Répondre à NoSFe

3

Canard007, le 25 jun 2004 à 16:50:28

Les classes filles ne peuvent pas modifier les attributs des classes parents declaré en private ???

Répondre à Canard007

4

NoSFe, le 25 jun 2004 à 16:51:46

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;
}

Répondre à NoSFe

5

pom, le 25 jun 2004 à 17:01:07

Merci NoSFe, effectivement les classes heritières ne peuvent accéder qu'au protected.
Mais j'aimerais que ma classe dérivée Mamifère accède au private de Animal (je voudrais afficher la race de mon Animal)

J'ai fait Animal::get_race(return race;}

mais cout<<mamifere.get_race(); ne marche pas (j'ai créé mamifere comme un Mamifere)

pom

Répondre à pom

7

tafiscobar, le 25 jun 2004 à 17:06:38

Et get_race, il est public ou pas?? s'il n'est pas public, tu ne peux y accéder depuis l'extérieur. S'il est protected, seules les classes filles y accédent et private, personne, c'est le secret de la classe.

tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!

Répondre à tafiscobar

6

NoSFe, le 25 jun 2004 à 17:05:46

Race Animal::getRace()
{ return (this.race);
}

Répondre à NoSFe

8

pom, le 28 jun 2004 à 10:33:21

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

Répondre à pom

9

 Behall, le 8 aoû 2008 à 16:19:03

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.

Répondre à Behall