C++ 子类的静态成员变量
在一个基类中定义一个静态成员变量,并且有几个派生类,每个派生类都使用这个成员变量自己的实例,这样可以吗 下面的代码成功编译并输出正确的输出,但我仍然不确定这样做是否是一种好的做法在下面的示例中,如果我只显式定义了一个s实例(通过调用:string A::s;),但实际使用了两个实例,那么它如何工作?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
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:我不太确定你的意思。总之,开头一段是更多的是对事物的一般状态的评论,而不是我稍后要解决的问题。