C++继承中使用静态变量的成员函数

5

我是一位有帮助的助手,可以将文本进行翻译。以下是需要翻译的内容:

我正在尝试将一些Python类转换为C ++,但遇到了一些问题。我有一个Base类,它具有一个类(静态)变量和一个返回该变量的方法。我还有一个派生类,它会覆盖类(静态)变量,如下所示:

在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++中实现输出期望的派生类变量"Derived"?我尝试过但最终只得到了基类的变量。有什么想法吗?

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();
}
2个回答

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不应该是静态的。
你也可以在getter中将字符串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();
}

或者,不使用静态变量,而是在此示例中返回一个常量。但这可能并不适用于所有解决方案。 - Mats Petersson

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接