Surdéfinition statique (static) d'une variable membre [Résolu]

Signaler
Messages postés
7
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
18 janvier 2008
-
PetersonG
Messages postés
7
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
18 janvier 2008
-
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

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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;}
Messages postés
7
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
18 janvier 2008

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 ! ^^
Messages postés
7
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
18 janvier 2008

Ah bah voui ^^'

Des fois je cherche trop loin !
Merci beaucoup !