当前位置:  开发笔记 > 编程语言 > 正文

子类的静态成员变量

如何解决《子类的静态成员变量》经验,为你挑选了1个好方法。

是否可以在基类中定义静态成员变量,并且具有多个派生类,每个派生类都使用自己的成员变量实例?

下面的代码成功编译,并输出正确的输出,但我仍然不确定做这样的事情是一个好习惯.在下面的示例中,如果我只显式定义了一个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的值,则这将不起作用.

如果BC对象在不同的​​线程中创建,则可能会遇到同步问题.你最终会得到UB.



1> dirkgently..:

确实非常奇怪地使用了继承.根据良好的OO设计原则,基类应该理想地定义接口,并且如果可能的话根本不包含任何状态.

这是有效的,因为您foo()重置A::s每次调用它的值.尝试打印地址A::s.只有一个对象.如果您不是每次都设置该值,并且您有多个对象使用另一个成员函数bar()来读取A :: s的值,则这将不起作用.

如果BC对象在不同的​​线程中创建,则可能会遇到同步问题.你最终会得到UB.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有