Witam
W jaki sposób są dziedziczone składowe statyczne? Jeżeli są dziedziczone to czy odnoszą się do klasy bazowej czy podstawowej?
Wydaje mi sie, ze skladowe statyczne nie sa dziedziczone. Po prostu istnieje jeden egzemplarz tej zmiennej dla klasy bazowej i klasy pochodnej.
Przy czym inicjalizacja musi sie odbywac dla klasy bazowej, czyli np.
int bazowa::zmienna_statyczna = 3;
w kodzie mozesz sie odwolywac np.
bazowa::zmienna_statyczna
pochodna::zmienna_statyczna
oczywiscie przypisania nie obowiazuja te same zasady co inicjalizacji.
Trochę zmartwiłą mnie twoja odpowiedź, bo ja właśnie potrzebuje odziedziczyć z klasy abstrakcyjnej składową statyczna, mniej więcej tak by to wyglądało:
class IKlasa
{
public:
static const int m_iPriority;
};
class TTyp1 : public IKlasa
{
};
const int TTyp1::m_iPriority = 1;
class TTyp2 : public IKlasa
{
};
const int TTyp2::m_iPriority = 2;
Czy ktoś wie jak ten problem rozwiązać?
w klasach pochodnych musisz ponownie zadeklarwac to pole - wtedy nowa deklaracja przesloni poprzednia (zwroc uwage, ze pole z klasy bazowej jest jedno dla wszystkich klas ale ma zasieg klasy bazowej. Jezeli teraz w zasiegu klasy pochodnej ponownie zdefiniujesz to pole to poprzednia definicja bedzie przeslonieta). Oczywiscie do deklaracji z klasy bazowej mozesz sie nadal odwolywac - poprzez operator zasiegu. (dwie kropki).
abcd napisał(a)
class IKlasa
{
public:
static const int m_iPriority;
};
class TTyp1 : public IKlasa
{
};
const int TTyp1::m_iPriority = 1;
class TTyp2 : public IKlasa
{
};
const int TTyp2::m_iPriority = 2;
Składnik statyczny jest jeden dla wszystkich trzech klas, w tak samo przez nie wydziany i inicjalizowany raz 'IKlasa::m_iPriority = xxx;'
Jeśli interfejs IKlasa ma kokoRZystaćystać z tej zmiennej musi to byś składnik wirtualny.Skożystaj z wirtualnej funkcji, np. w klasie bazowej deklaracje "pure virtual"
virtual int m_iPriority() = 0;
A w klasach pochodnych np. virtual int m_iPriority() { return 1; };