OVH Cloud OVH Cloud

Masquage de variables en C++

6 réponses
Avatar
caraux
Pardon de revenir vous déranger ...

Voici un programme exemple.
La variable n est définie dans la classe "Base" AINSI QUE dans la
classe "Derived".
La méthode print() n'est définie qu'au niveau de la classe Base.
Comment faire pour que la méthode print() affiche correctement la
valeur de n quand elle est utilisée sur un objet de la classe Derived.

Comment faire pour que dans main() le deuxième appel à print() affiche
2 ?

Ce doit être simple mais je n'ai pas réussi à trouver seul la
solution.

J'ai besoin de ce genre de chose pour gérer des pointeurs portant le
même nom, mais pointant sur des objets de classes différentes.

Merci pour vos lumières.

Gilles

#include <iostream.h>
class Base
{ public:
int n;
void print(){ cout << "Base::print de n : " << n << "\n";};
};

class Derived : public Base
{ public:
int n;
};

void main()
{
Base aBase;
Derived aDerived;

aBase.n = 1;
aDerived.n = 2;

aBase.print();
aDerived.print();

cin.get( );
}

6 réponses

Avatar
Fabien LE LEZ
On 22 Dec 2004 00:33:28 -0800, (Gilles):

La variable n est définie dans la classe "Base" AINSI QUE dans la
classe "Derived".


C'est autorisé, ça ? :-o

En tout cas, même si les compilateurs acceptent ça, c'est de
l'obfuscation.

La méthode


Evite de parler de "méthode" en C++, ça porte à confusion : on ne sait
pas si tu parles d'une fonction membre virtuelle ou d'une fonction
membre en général.

La méthode classique pour gérer ce genre de cas est d'utiliser une
fonction virtuelle :

class Base
{
public:
void print (ostream& os) const { os << GetMachin() << endl; }
private:
int GetMachin() const { return n; }
int n;
};

class Derivee: public Base
{
private:
int une_autre_variable;
int GetMachin() const { return une_autre_variable; }
};


--
;-)

Avatar
Michel Michaud
Dans le message ,
La méthode classique pour gérer ce genre de cas est d'utiliser une
fonction virtuelle :

class Base
{
public:
void print (ostream& os) const { os << GetMachin() << endl; }
private:
int GetMachin() const { return n; }


J'imagine que tu voulais mettre

virtual int GetMachin() const { return n; }

int n;
};

class Derivee: public Base
{
private:
int une_autre_variable;
int GetMachin() const { return une_autre_variable; }
};



--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Fabien LE LEZ
On Wed, 22 Dec 2004 10:24:57 -0500, "Michel Michaud" :

J'imagine que tu voulais mettre


Oui. J'avais prévenu...
<news:

--
;-)

Avatar
drkm
"Michel Michaud" writes:

J'imagine que tu voulais mettre

virtual int GetMachin() const { return n; }


J'espère ;-). Ce qui constitue le moyen d'approcher une « variable
virtuelle », que je pense que voulait le PO.

--drkm

Avatar
Stephane Wirtel
En utilisant le mot this qui référencie l'objet de manière dynamique.

Si tu emplois uniquement le nom de la variable, tu auras des problemes car ton code est mal écrit.
En spécifiant plus clairement ta variable via this, this->n . Durant l'exécution du code, this
représentera l'objet qui est employé. Soit un "Base" ou un "Derived".

Bien à toi,

Stéphane
Avatar
drkm
Stephane Wirtel writes:

En utilisant le mot this qui référencie l'objet de manière dynamique.

Si tu emplois uniquement le nom de la variable, tu auras des problemes car ton code est mal écrit.
En spécifiant plus clairement ta variable via this, this->n . Durant l'exécution du code, this
représentera l'objet qui est employé. Soit un "Base" ou un "Derived".


Les variables virtuelles n'existent pas en C++.

--drkm