Quando os membros estáticos são herdados, eles são estáticos para toda a hierarquia ou apenas para essa classe, ou seja:
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;
}
o total seria 3 em todas as três instâncias ou seria 2 para SomeClass
e 1 para SomeDerivedClass
?
fonte
static int total
ser distinto para cada classe derivada, a única maneira de alcançá-lo é adicionarstatic int total
a cada classe? Ou é possível usar apenas a definição de classe base (?), Porque ter variáveltotal
deve ser propriedade de todas as classes. Por outro lado, deve serstatic
.Na verdade, a resposta é quatro em todos os casos, pois a construção de
SomeDerivedClass
fará com que o total seja incrementado duas vezes .Aqui está um programa completo (que usei para verificar minha resposta):
E os resultados:
fonte
É 4 porque quando o objeto derivado é criado, o construtor da classe derivada chama o construtor da classe base.
Portanto, o valor da variável estática é incrementado duas vezes.
fonte
Seria:
fonte
O construtor SomeClass () está sendo chamado automaticamente quando SomeDerivedClass () é chamado, esta é uma regra C ++. É por isso que o total é incrementado uma vez para cada objeto SomeClass e, em seguida, duas vezes para o objeto SomeDerivedClass. 2x1 + 2 = 4
fonte
3 em todos os três casos.
E para sua outra pergunta, parece que você realmente só precisa de uma variável const em vez de estática. Pode ser mais autoexplicativo fornecer uma função virtual que retorna a variável de que você precisa, que é substituída nas classes derivadas.
A menos que esse código seja chamado em um caminho crítico onde o desempenho é necessário, sempre opte pelo código mais intuitivo.
fonte
Sim, a classe derivada conteria a mesma variável estática, ou seja, todas conteriam 3 para o total (assumindo que o total foi inicializado em 0 em algum lugar).
fonte