Наследуются ли статические поля?



когда статические члены наследуются, они статичны для всей иерархии или только для этого класса, т. е.:



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?

513   7  

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

    Ничего не найдено.