Surdéfinition statique (static) d'une variable membre

Résolu
PetersonG Messages postés 7 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 18 janvier 2008 - 15 janv. 2008 à 11:34
PetersonG Messages postés 7 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 18 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 ^^

D'avance merci !

Peterson

3 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
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.

un petit exemple pour convaincre :

#include

<stdio.h>class

A{

public

:

int a;};

class

B :
public A{

public

:

int a;};

__int32

main(
void){

B c;

c.a=1;

c.A::a=2;

printf(

"%i\n",c.a);printf(

"%i\n",c.A::a);

return 0x0;}
3
PetersonG Messages postés 7 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 18 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 ! ^^
0
PetersonG Messages postés 7 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 18 janvier 2008
15 janv. 2008 à 15:20
Ah bah voui ^^'

Des fois je cherche trop loin !
Merci beaucoup !
0
Rejoignez-nous