Kiedy statyczne elementy członkowskie są dziedziczone, czy są statyczne dla całej hierarchii, czy tylko dla tej klasy, tj .:
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;
}
czy łącznie wyniosą 3 we wszystkich trzech przypadkach, czy też 2 dla SomeClass
i 1 dla SomeDerivedClass
?
źródło
static int total
być odrębny dla każdej klasy pochodnej, to jedyny sposób, aby to osiągnąć, to dodaćstatic int total
do każdej klasy? A może można użyć tylko definicji klasy bazowej (?), Ponieważ posiadanie zmiennejtotal
powinno być własnością każdej klasy. Z drugiej strony tak powinno byćstatic
.W rzeczywistości we wszystkich przypadkach odpowiedź to cztery , ponieważ konstrukcja
SomeDerivedClass
spowoduje dwukrotny wzrost sumy .Oto kompletny program (którego użyłem do weryfikacji mojej odpowiedzi):
A wyniki:
źródło
Jest to 4, ponieważ podczas tworzenia obiektu pochodnego konstruktor klasy pochodnej wywołuje konstruktor klasy bazowej.
Zatem wartość zmiennej statycznej jest zwiększana dwukrotnie.
źródło
To byłby:
źródło
Konstruktor SomeClass () jest wywoływany automatycznie po wywołaniu SomeDerivedClass (), jest to reguła C ++. Dlatego suma jest zwiększana raz dla każdego obiektu SomeClass, a następnie dwukrotnie dla obiektu SomeDerivedClass. 2x1 + 2 = 4
źródło
3 we wszystkich trzech przypadkach.
A jeśli chodzi o twoje drugie pytanie, wygląda na to, że naprawdę potrzebujesz zmiennej const zamiast statycznej. Zapewnienie funkcji wirtualnej, która zwraca potrzebną zmienną, która jest zastępowana w klasach pochodnych, może być bardziej oczywiste.
O ile ten kod nie jest wywoływany na ścieżce krytycznej, w której wymagana jest wydajność, zawsze wybieraj bardziej intuicyjny kod.
źródło
Tak, klasa pochodna zawierałaby tę samą zmienną statyczną, tj. Wszystkie zawierałyby 3 dla total (zakładając, że suma została gdzieś zainicjowana na 0).
źródło