Lorsque les membres statiques sont hérités, sont-ils statiques pour toute la hiérarchie, ou simplement pour cette classe, c'est-à-dire:
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;
}
le total serait-il de 3 dans les trois cas, ou serait-il de 2 pour SomeClass
et de 1 pour SomeDerivedClass
?
la source
static int total
être distinct pour chaque classe dérivée, le seul moyen d'y parvenir est d'ajouterstatic int total
à chaque classe? Ou est-il possible d'utiliser uniquement la définition de classe de base (?), Car avoir une variabletotal
devrait être la propriété de chaque classe. D'un autre côté, ça devrait l'êtrestatic
.La réponse est en fait quatre dans tous les cas, puisque la construction de
SomeDerivedClass
fera augmenter le total deux fois .Voici un programme complet (que j'ai utilisé pour vérifier ma réponse):
Et les résultats:
la source
C'est 4 parce que lorsque l'objet dérivé est créé, le constructeur de classe dérivée appelle le constructeur de classe de base.
Ainsi, la valeur de la variable statique est incrémentée deux fois.
la source
Ce serait:
la source
Le constructeur SomeClass () est appelé automatiquement lorsque SomeDerivedClass () est appelé, il s'agit d'une règle 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
la source
3 dans les trois cas.
Et pour votre autre question, il semble que vous ayez vraiment besoin d'une variable const au lieu de static. Il peut être plus explicite de fournir une fonction virtuelle qui renvoie la variable dont vous avez besoin qui est remplacée dans les classes dérivées.
À moins que ce code ne soit appelé dans un chemin critique où les performances sont nécessaires, optez toujours pour le code le plus intuitif.
la source
Oui, la classe dérivée contiendrait la même variable statique, c'est-à-dire qu'elles contiendraient toutes 3 pour le total (en supposant que le total a été initialisé à 0 quelque part).
la source