Wenn statische Elemente geerbt werden, sind sie statisch für die gesamte Hierarchie oder nur für diese Klasse, dh:
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;
}
wäre insgesamt 3 in allen drei Fällen oder wäre es 2 für SomeClass
und 1 für SomeDerivedClass
?
quelle
static int total
für jede abgeleitete Klasse unterschiedlich sein möchte , ist der einzige Weg, dies zu erreichen,static int total
zu jeder Klasse hinzuzufügen ? Oder ist es möglich, nur die Basisklassendefinition (?) Zu verwenden, da eine Variabletotal
die Eigenschaft jeder Klasse sein sollte. Auf der anderen Seite sollte es seinstatic
.Die Antwort ist tatsächlich vier in allen Fällen, da die Konstruktion von
SomeDerivedClass
bewirkt, dass die Summe zweimal erhöht wird .Hier ist ein vollständiges Programm (mit dem ich meine Antwort überprüft habe):
Und die Ergebnisse:
quelle
Es ist 4, da der abgeleitete Klassenkonstruktor beim Erstellen des abgeleiteten Objekts den Basisklassenkonstruktor aufruft.
Der Wert der statischen Variablen wird also zweimal erhöht.
quelle
Es wäre:
quelle
Der SomeClass () -Konstruktor wird automatisch aufgerufen, wenn SomeDerivedClass () aufgerufen wird. Dies ist eine C ++ - Regel. Aus diesem Grund wird die Summe einmal pro SomeClass-Objekt und dann zweimal für SomeDerivedClass-Objekte erhöht. 2x1 + 2 = 4
quelle
3 in allen drei Fällen.
Und für Ihre andere Frage sieht es so aus, als ob Sie wirklich nur eine konstante Variable anstelle einer statischen benötigen. Es kann selbsterklärender sein, eine virtuelle Funktion bereitzustellen, die die benötigte Variable zurückgibt, die in abgeleiteten Klassen überschrieben wird.
Wenn dieser Code nicht in einem kritischen Pfad aufgerufen wird, in dem Leistung erforderlich ist, wählen Sie immer den intuitiveren Code.
quelle
Ja, die abgeleitete Klasse würde dieselbe statische Variable enthalten, dh sie würde alle 3 für total enthalten (vorausgesetzt, total wurde irgendwo auf 0 initialisiert).
quelle