Наследуются ли статические поля?
когда статические члены наследуются, они статичны для всей иерархии или только для этого класса, т. е.:
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;
}
всего будет 3 во всех трех случаях, или это будет 2 для SomeClass и 1 SomeDerivedClass?
7 ответов:
3 во всех случаях, поскольку
static int totalунаследовалаSomeDerivedClassименно вSomeClass, а не отдельной переменной.редактировать: на самом деле 4 во всех случаях, как @ejames заметил и указал в своем ответе, который см.
изменить: код во втором вопросе отсутствует
intв обоих случаях, но это делает его хорошо, то есть:class A { public: static int MaxHP; }; int A::MaxHP = 23; class Cat: A { public: static const int MaxHP = 100; };отлично работает и с разными значениями для A:: MaxHP и Cat:: MaxHP -- в этом случае подкласс это" не наследует " статику от базового класса, так как, так сказать, он "скрывает" ее своим собственным омонимичным.
ответ четыре во всех случаях, начиная со строительства
SomeDerivedClassприведет к увеличению общей суммы два раза.вот полная программа (которую я использовал для проверки моего ответа):
#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; }результаты:
A.total = 4 B.total = 4 C.total = 4
Это 4, потому что при создании производного объекта, конструктор производного класса вызывает конструктор базового класса.
Таким образом, значение статической переменной увеличивается в два раза.
#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() total = 1 A() total = 2 A() total = 3 B() total = 4
конструктор SomeClass() вызывается автоматически при вызове SomeDerivedClass (), это правило C++. Вот почему общая сумма увеличивается один раз для каждого объекта SomeClass, а затем дважды для объекта SomeDerivedClass. 2x1+2=4
3 во всех трех случаях.
и для вашего другого вопроса, похоже,вам действительно просто нужна переменная const вместо статической. Это может быть более понятным для поставщика виртуальной функции, которая возвращает необходимую переменную, которая переопределяется в производных классах.
Если этот код не вызывается в критическом пути, где необходима производительность, всегда выбирайте более интуитивный код.
да, производный класс будет содержать одну и ту же статическую переменную, т. е. - все они будут содержать 3 для total (предполагая, что total был инициализирован до 0 где-то).
Comments