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