2009-06-15 11 views
86

Wenn statische Elemente vererbt werden, sind sie statisch für die gesamte Hierarchie oder nur dieser Klasse, das heißt:Sind statische Felder geerbt?

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; 
} 

gesamt 3 in allen drei Fällen wäre, oder würde es 2 für SomeDerivedClass für SomeClass und 1 liegen ?

Antwort

44

3 in allen Fällen, da die static int total geerbt von SomeDerivedClass ist genau die in SomeClass, keine eindeutige Variable.

Bearbeiten: eigentlich in allen Fällen, wie @ejames entdeckt und in seiner Antwort hingewiesen, die sehen.

Edit: der Code in der zweiten Frage fehlt die int in beiden Fällen, aber das Hinzufügen macht es OK, das heißt:

class A 
{ 
public: 
    static int MaxHP; 
}; 
int A::MaxHP = 23; 

class Cat: A 
{ 
public: 
    static const int MaxHP = 100; 
}; 

funktioniert gut und mit unterschiedlichen Werten für A :: MaxHP und Katze: : MaxHP - in diesem Fall "erbt" die Unterklasse das Statische nicht von der Basisklasse, da sie es sozusagen mit seinem eigenen gleichnamigen Objekt "versteckt".

+8

gute Erklärung, aber die numerische Antwort ist eigentlich 4, 3 nicht meine Antwort (http: // Stackoverflow.com/questions/998247/sind-statisch-Mitglieder-ererbt-c/998298 # 998298) –

+0

+1, Hervorragender Punkt, ich bearbeite die Antwort auf Ihre, danke! –

+1

+1, obwohl man "+4 zu was auch immer das statische Mitglied initialisiert wird" richtiger sagen sollte. Das statische Member ist weder lokaler Bereich noch Namespacebereich, daher muss irgendwo eine Definition vorhanden sein, die einen Wert zuweist (_not notly_ zero). Ansonsten erfüllt der Code nicht die Definitionsdefinition und wird nicht kompiliert. – Damon

0

3 in allen drei Fällen.

Und für Ihre andere Frage, es sieht so aus, als ob Sie wirklich nur eine const-Variable statt statisch benötigen. Es kann selbsterklärend sein, eine virtuelle Funktion bereitzustellen, die die von Ihnen 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, entscheiden Sie sich immer für den intuitiveren Code.

0

Ja, die abgeleitete Klasse würde die gleiche statische Variable enthalten, d. H. - sie würden alle 3 für die Summe enthalten (unter der Annahme, dass die Summe irgendwo auf 0 initialisiert wurde).

87

Die Antwort ist eigentlich vier in allen Fällen, da der Bau von SomeDerivedClass wird die Gesamt dazu führen zweimal erhöht werden. Hier

ist ein komplettes Programm (die ich verwendet, um meine Antwort zu überprüfen):

#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; 
} 

Und die Ergebnisse:

A.total = 4 
B.total = 4 
C.total = 4 
7

Es ist 4, da, wenn das abgeleitete Objekt erstellt wird, die abgeleitete Der Klassenkonstruktor ruft den Basisklassenkonstruktor auf.
Also der Wert der statischen Variable wird zweimal inkrementiert.

0

Der SomeClass() - Konstruktor wird automatisch aufgerufen, wenn SomeDerivedClass() aufgerufen wird, dies ist eine C++ - Regel. Aus diesem Grund wird die Summe einmal für jedes SomeClass-Objekt und dann zweimal für das SomeDerivedClass-Objekt inkrementiert. 2x1 + 2 = 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; 
} 

Es wäre:

A() total = 1 
A() total = 2 
A() total = 3 
B() total = 4 
Verwandte Themen