Когда статические члены наследуются, являются ли они статическими для всей иерархии или только для этого класса, то есть:
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
?
источник
static int total
отличаться для каждого производного класса, единственный способ добиться этого - добавитьstatic int total
к каждому классу? Или можно использовать только определение базового класса (?), Потому что наличие переменнойtotal
должно быть свойством каждого класса. С другой стороны, так и должно бытьstatic
.На самом деле во всех случаях ответ будет четыре , так как построение
SomeDerivedClass
приведет к увеличению суммы в два раза .Вот полная программа (которую я использовал для проверки своего ответа):
И результаты:
источник
Это 4, потому что при создании производного объекта конструктор производного класса вызывает конструктор базового класса.
Таким образом, значение статической переменной увеличивается вдвое.
источник
Это было бы:
источник
Конструктор SomeClass () вызывается автоматически при вызове SomeDerivedClass (), это правило C ++. Вот почему сумма увеличивается один раз для каждого объекта SomeClass, а затем дважды для объекта SomeDerivedClass. 2x1 + 2 = 4
источник
3 во всех трех случаях.
И для вашего другого вопроса, похоже, вам действительно просто нужна переменная const вместо static. Может быть более очевидным будет предоставить виртуальную функцию, которая возвращает нужную вам переменную, которая переопределяется в производных классах.
Если этот код не вызывается на критическом пути, где необходима производительность, всегда выбирайте более интуитивно понятный код.
источник
Да, производный класс будет содержать одну и ту же статическую переменную, т. Е. Все они будут содержать 3 в сумме (при условии, что сумма где-то инициализирована равной 0).
источник