PetersonG
Messages postés7Date d'inscriptionlundi 19 mars 2007StatutMembreDernière intervention18 janvier 2008
-
15 janv. 2008 à 11:34
PetersonG
Messages postés7Date d'inscriptionlundi 19 mars 2007StatutMembreDernière intervention18 janvier 2008
-
15 janv. 2008 à 15:20
Bonjour,
Une drôle d'idée m'a fait surdéfinir en static une variable membre d'une classe parente, et, à ma grande surprise, le code compile sans problème sous MSVC++.
Plus concrètement, ça donne :
class A
{
public:
A();
virtual ~A();
void setA(int _a)
{
a=_a;
}
protected:
int a;
};
class B : public A
{
public:
B();
virtual ~B();
virtual void setA(int _a)
{
a=_a;
}
protected:
static int a;
};
B::a = 5;
B b;
b.setA(8);
Ce qui m'étonne, c'est qu'il n'y a aucun conflict de nommage, même à l'usage de la variable a !
L'un d'entre vous saurait-il se qu'il se produit alors en mémoire ? Est-ce que la variable membre a est dupliquée ? Si oui, comment se fait-il qu'il n'y ait pas de conflict lorsque j'accède à a ?
Il me semble que la classe B "encapsule" la classe A genre :
____________________
| Class B |
| ________________ |
| | Class A | |
| |_______________ | |
|___________________ |
du coup, l'espace mémoire pour la variable membre a devrait être réservé dans l'espace mémoire de la classe A…
J'avoue que je ne comprends pas ^^
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 15 janv. 2008 à 15:16
En fait pas de rapport avec le fait que les deux soient différents; la norme C++ permet d'appeler un membre d'une classe dérivée du même nom qu'un membre de la classe de base, en ce cas comme tu le pensais les deux membres sont dupliqués. Il n'y a pas conflit de nommage car la règle est que la variable utilisée est celle correspondant à la classe de l'objet; cependant tu peux tout de même accéder à la variable de la classe de base depuis une dérivée par la syntaxe :
objet.Base::membre.
PetersonG
Messages postés7Date d'inscriptionlundi 19 mars 2007StatutMembreDernière intervention18 janvier 2008 15 janv. 2008 à 12:40
Oups, petite erreur… Il fallait lire (enfin, j'aurais dû écrire…) :
class B : public A
{
public:
B();
virtual ~B();
static void setA(int _a)
{
a=_a;
}
protected:
static int a;
};
Quoi qu'il en soit, si qqun se posait cette même question, apparemment, ce sont juste deux symboles différents pour le compilo, c'est donc dupliqué, et pas surdéfinit, et à cause du mot clef "static", le symbole est différent pour le compilo, donc il n'y a pas conflict de nommage.
Si qqun a plus de précisions, je suis preneur ! ^^