2012-12-23 41 views
5

Tôi đang cố gắng chuyển đổi một số lớp Python thành C++ nhưng có một số vấn đề. Tôi có một lớp cơ sở trong đó có một lớp (tĩnh) biến và một phương pháp mà trả về nó. Tôi cũng có một lớp được thừa kế mà đè (tĩnh) biến lớp học như vậy,C++ Các hàm thành viên thừa kế sử dụng các biến tĩnh

Trong Python:

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

class Derived(Base): 
    class_var = "Derived" 

d = Derived() 
d.printClassVar() 

đó in ra các biến lớp được thừa kế mong muốn, "nguồn gốc". Bất kỳ ý tưởng làm thế nào tôi có thể nhận được các chức năng tương tự trong c + +? Tôi đã thử nhưng cuối cùng nhận được biến lớp của lớp cơ sở.

Trong 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(); 
} 

Trả lời

3

Viết một hàm ảo mà trả về một tham chiếu đến các thành viên tĩnh:

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

Lưu ý rằng printStaticVar không nên tĩnh.


Bạn cũng có thể làm cho các chuỗi static địa phương bên trong 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

Hoặc, thay vì có một biến tĩnh gì cả, chỉ đơn giản là trở lại một hằng số, trong ví dụ này. Tuy nhiên, điều đó có thể không phù hợp với tất cả các chất tan. –

0

Một khả năng khác có thể là:

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) {} 
}; 
Các vấn đề liên quan