105 votes

Les champs statiques sont-ils hérités ?

Lorsque des membres statiques sont hérités, sont-ils statiques pour l'ensemble de la hiérarchie ou seulement pour cette classe, par exemple :

class SomeClass
{
public:
    SomeClass(){total++;}
    static int total;
};

class SomeDerivedClass: public SomeClass
{
public:
    SomeDerivedClass(){total++;}
};

int main()
{
    SomeClass A;
    SomeClass B;
    SomeDerivedClass C;
    return 0;
}

serait-il de 3 au total dans les trois cas, ou de 2 pour les cas suivants SomeClass et 1 pour SomeDerivedClass ?

102voto

e.James Points 51680

La réponse est en fait quatre dans tous les cas, puisque la construction de SomeDerivedClass fera en sorte que le total soit incrémenté deux fois .

Voici un programme complet (que j'ai utilisé pour vérifier ma réponse) :

#include <iostream>
#include <string>

using namespace std;

class SomeClass
{
    public:
        SomeClass() {total++;}
        static int total;
        void Print(string n) { cout << n << ".total = " << total << endl; }
};

int SomeClass::total = 0;

class SomeDerivedClass: public SomeClass
{
    public:
        SomeDerivedClass() {total++;}
};

int main(int argc, char ** argv)
{
    SomeClass A;
    SomeClass B;
    SomeDerivedClass C;

    A.Print("A");
    B.Print("B");
    C.Print("C");

    return 0;
}

Et les résultats :

A.total = 4
B.total = 4
C.total = 4

56voto

Alex Martelli Points 330805

3 dans tous les cas, puisque l static int total hérité de SomeDerivedClass est exactement celui qui se trouve dans SomeClass n'est pas une variable distincte.

Edit : en fait 4 dans tous les cas, comme @ejames l'a repéré et signalé dans sa réponse, qui voit.

Edit : le code dans la deuxième question n'a pas le caractère int dans les deux cas, mais le fait de l'ajouter le rend correct, c'est-à-dire :

class A
{
public:
    static int MaxHP;
};
int A::MaxHP = 23;

class Cat: A
{
public:
    static const int MaxHP = 100;
};

fonctionne bien et avec des valeurs différentes pour A::MaxHP et Cat::MaxHP -- dans ce cas, la sous-classe n'hérite pas de la statique de la classe de base, puisqu'elle la "cache" avec sa propre statique homonyme.

11voto

VenuGopal Points 21

C'est 4 parce que lorsque l'objet dérivé est créé, le constructeur de la classe dérivée appelle le constructeur de la classe de base.
La valeur de la variable statique est donc incrémentée deux fois.

6voto

rocky4android Points 31
#include<iostream>
using namespace std;

class A
{
public:
    A(){total++; cout << "A() total = "<< total << endl;}
    static int total;
};

int A::total = 0;

class B: public A
{
public:
    B(){total++; cout << "B() total = " << total << endl;}
};

int main()
{
    A a1;
    A a2;
    B b1;

    return 0;
}

Ça le serait :

A() total = 1
A() total = 2
A() total = 3
B() total = 4

2voto

Darko Maksimovic Points 194

Le constructeur SomeClass() est appelé automatiquement lorsque SomeDerivedClass() est appelé, c'est une règle du C++. C'est pourquoi le total est incrémenté une fois pour chaque objet SomeClass, puis deux fois pour l'objet SomeDerivedClass. 2x1+2=4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X