2012-12-23 68 views
5

我想将一些Python类转换为C++,但我有一些麻烦。我有一个基类,它有一个类(静态)变量和返回它的方法。我也有一个派生类将覆盖类(静态)变量,像这样,C++继承使用静态变量的成员函数

在Python:

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

class Derived(Base): 
    class_var = "Derived" 

d = Derived() 
d.printClassVar() 

其打印出所希望的派生类变量,“派生”。任何想法如何在C++中获得相同的功能?我试过但最终得到了基类的类变量。

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

回答

3

收件它返回到静止构件的基准的虚拟功能:

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

注意printStaticVar不应该是静态的。


你也可以将字符串static,吸气内部本地:

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

或者,而不是有一个静态变量在所有的,只是回报一个常数,在这个例子中。然而,这可能不适合所有的解决方案。 –

0

另一种可能性是:

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