C++ 子类的静态成员变量

C++ 子类的静态成员变量,c++,inheritance,static,C++,Inheritance,Static,在一个基类中定义一个静态成员变量,并且有几个派生类,每个派生类都使用这个成员变量自己的实例,这样可以吗 下面的代码成功编译并输出正确的输出,但我仍然不确定这样做是否是一种好的做法在下面的示例中,如果我只显式定义了一个s实例(通过调用:string A::s;),但实际使用了两个实例,那么它如何工作? class A { protected: void SetS(string new_s){s = new_s;} void PrintS(){cout << s

在一个基类中定义一个静态成员变量,并且有几个派生类,每个派生类都使用这个成员变量自己的实例,这样可以吗

下面的代码成功编译并输出正确的输出,但我仍然不确定这样做是否是一种好的做法在下面的示例中,如果我只显式定义了一个s实例(通过调用:string A::s;),但实际使用了两个实例,那么它如何工作?

class A 
{
   protected:
    void SetS(string new_s){s = new_s;}
    void PrintS(){cout << s << endl;};
   private:
    static string s;

};

class B : public A
{
   public:
    void foo(){ SetS("bbb"); PrintS();};
};

class C : public A
{
   public:
    void foo(){ SetS("ccc"); PrintS();};
};

string A::s;

int main()
{
    B b;
    b.foo(); // results in output: bbb
    C c;
    c.foo(); // results in output: ccc
    b.foo(); // results in output: bbb
}
A类
{
受保护的:
空集(字符串new_s){s=new_s;}

void PrintS(){cout继承的确是一种非常奇怪的用法。根据良好的OO设计原则,基类应该在理想情况下定义接口,并且尽可能少地包含或根本不包含状态

这是因为
foo()
每次调用时都会重置
A::s
的值。请尝试打印
A::s
的地址。只有一个对象。如果不每次设置值,并且使用另一个成员函数有多个对象
bar()
读取A::s的值


如果
B
C
对象也是在单独的线程中创建的,那么您可能会遇到同步问题。您最终会遇到UB。

继承的一个非常奇怪的用法。根据良好的OO设计原则,基类应该理想地定义接口,并且尽可能少地包含或根本不包含状态

这是因为
foo()
每次调用时都会重置
A::s
的值。请尝试打印
A::s
的地址。只有一个对象。如果不每次设置值,并且使用另一个成员函数有多个对象
bar()
读取A::s的值


如果
B
C
对象也是在单独的线程中创建的,那么您可能会遇到同步问题。最终您将得到UB。

谢谢,它完全回答了我的问题。基类应该定义接口。但基类可能只是工作扩展。@Mykola Golubyev:我不太确定您的意思。总之,基类是开头一段更多的是对事物的一般状态的评论,而不是我稍后要解决的问题。谢谢,它完全回答了我的问题。基类应该定义接口。但基类可以只是工作扩展。@Mykola Golubyev:我不太确定你的意思。总之,开头一段是更多的是对事物的一般状态的评论,而不是我稍后要解决的问题。