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";};
};
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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; } };
-- ;-)
On 22 Dec 2004 00:33:28 -0800, caraux@lirmm.fr (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; }
};
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; } };
-- ;-)
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/
Dans le message pcdis05ptbj6rpeulpc4i4v6p7lpf653jb@4ax.com,
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 mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
J'espère ;-). Ce qui constitue le moyen d'approcher une « variable virtuelle », que je pense que voulait le PO.
--drkm
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
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".
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
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".
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".
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".