【问题标题】:static member variable of a subclassed class子类的静态成员变量
【发布时间】:2009-03-01 11:05:36
【问题描述】:

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

以下代码编译成功,并打印出正确的输出,但我仍然不确定这样做是否是一个好习惯。 在下面的例子中,如果我只明确定义了一个 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
}

【问题讨论】:

    标签: c++ inheritance static


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,它完全回答了我的问题。
    • 基类应该定义接口。但基类可以只是工作扩展。
    • @Mykola Golubyev:我不太清楚你的意思。无论如何,开头的段落更多的是对事物的一般状态的评论,而不是我稍后要解决的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多