2012-12-23 19 views
5

Próbuję przekonwertować niektóre klasy Python na C++, ale mam pewne problemy. Mam klasę Base, która ma zmienną klasy (statyczną) i metodę, która zwraca ją. I również klasę pochodnych, które zasłania zmienną klasy (statyczne), podobnie jak,Funkcje członków dziedziczenia C++ za pomocą zmiennych statycznych

W Pythonie

class Base: 
    class_var = "Base" 
    @classmethod 
    def printClassVar(cls): 
     print cls.class_var 

class Derived(Base): 
    class_var = "Derived" 

d = Derived() 
d.printClassVar() 

która drukuje się żądaną pochodną zmiennej klasie „pochodne”. Masz pomysł, jak uzyskać tę samą funkcjonalność w języku C++? Próbowałem, ale w końcu otrzymuję zmienną klasy klasy Base.

w C++

class Base 
{ 
public: 
    static void printStaticVar(){cout << s_var << endl;} 
    static string s_var; 
}; 
string Base::s_var = "Base"; 

class Derived : public Base 
{ 
public: 
    static string s_var; 
}; 
string Derived::s_var = "Derived"; 

void main() 
{ 
    Derived d; 
    d.printStaticVar(); 
} 

Odpowiedz

3

Napisz wirtualną funkcję, która zwraca odwołanie do członka statycznego:

class Base 
{ 
public: 
    void printStaticVar() {cout << get_string() << endl;} 
    static string s_var; 
    virtual string const& get_string() { return Base::s_var; } 
}; 
string Base::s_var = "Base"; 

class Derived : public Base 
{ 
public: 
    static string s_var; 
    virtual string const& get_string() { return Derived::s_var; } 
}; 
string Derived::s_var = "Derived"; 

void main() 
{ 
    Derived d; 
    d.printStaticVar(); 
} 

Zauważ, że printStaticVar nie powinna być statyczna.


Można również zrobić ciąg static lokalną wewnątrz getter:

class Base 
{ 
public: 
    void printStaticVar() {cout << get_string() << endl;} 
    virtual string const& get_string() { 
     static string str = "Base"; 
     return str; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual string const& get_string() { 
     static string str = "Derived"; 
     return str; 
    } 
}; 

void main() 
{ 
    Derived d; 
    d.printStaticVar(); 
} 
+0

Albo, zamiast zmiennej statycznej w ogóle, po prostu powrót stała, w tym przykładzie. Jednak może to nie być odpowiednie dla wszystkich solutonów. –

0

Inną możliwością może być:

class Base 
{ 
    const std::string var; 
public: 
    Base(std::string s="Base") : var(s) {} 
    void printVar() { std::cout << var << std::endl } 
}; 
class Derived : public Base 
{ 
public: 
    Derived(std::string s="Derived") : Base(s) {} 
}; 
Powiązane problemy