Cuando se heredan los miembros estáticos, ¿son estáticos para toda la jerarquía, o solo para esa clase, es decir:
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;
}
¿El total sería 3 en los tres casos, o sería 2 para SomeClass
y 1 para SomeDerivedClass
?
c++
inheritance
static
BartoszKP
fuente
fuente
static int total
ser distinto para cada clase derivada, ¿la única forma de lograrlo es agregarlostatic int total
a cada clase? ¿O es posible usar solo la definición de clase base (?), Porque tener una variabletotal
debería ser propiedad de cada clase. Por otro lado, debería serlostatic
.En realidad, la respuesta es cuatro en todos los casos, ya que la construcción de
SomeDerivedClass
hará que el total se incremente dos veces .Aquí hay un programa completo (que usé para verificar mi respuesta):
Y los resultados:
fuente
Es 4 porque cuando se crea el objeto derivado, el constructor de la clase derivada llama al constructor de la clase base.
Entonces, el valor de la variable estática se incrementa dos veces.
fuente
Podría ser:
fuente
El constructor SomeClass () se llama automáticamente cuando se llama SomeDerivedClass (), esta es una regla de C ++. Es por eso que el total se incrementa una vez por cada objeto SomeClass, y luego dos veces para el objeto SomeDerivedClass. 2x1 + 2 = 4
fuente
3 en los tres casos.
Y para su otra pregunta, parece que realmente solo necesita una variable constante en lugar de estática. Puede resultar más evidente proporcionar una función virtual que devuelva la variable que necesita, que se anula en las clases derivadas.
A menos que se llame a este código en una ruta crítica donde el rendimiento sea necesario, siempre opte por el código más intuitivo.
fuente
Sí, la clase derivada contendría la misma variable estática, es decir, todas contendrían 3 para el total (asumiendo que el total se inicializó a 0 en algún lugar).
fuente