Igo*_*Oks 1 c++ inheritance static
是否可以在基类中定义静态成员变量,并且具有多个派生类,每个派生类都使用自己的成员变量实例?
下面的代码成功编译,并输出正确的输出,但我仍然不确定做这样的事情是一个好习惯.在下面的示例中,如果我只显式定义了一个s实例(通过调用:string A :: s;),它实际上如何使用2个实例?
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
}
Run Code Online (Sandbox Code Playgroud)
确实非常奇怪地使用了继承.根据良好的OO设计原则,基类应该理想地定义接口,并且如果可能的话根本不包含任何状态.
这是有效的,因为您foo()重置A::s每次调用它的值.尝试打印地址A::s.只有一个对象.如果您不是每次都设置该值,并且您有多个对象使用另一个成员函数bar()来读取A :: s的值,则这将不起作用.
如果B和C对象在不同的线程中创建,则可能会遇到同步问题.你最终会得到UB.