子类的静态成员变量

Posted

技术标签:

【中文标题】子类的静态成员变量【英文标题】: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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢,它完全回答了我的问题。 基类应该定义接口。但基类可以只是工作扩展。 @Mykola Golubyev:我不太清楚你的意思。无论如何,开头的段落更多的是对事物的一般状态的评论,而不是我稍后要解决的问题。

以上是关于子类的静态成员变量的主要内容,如果未能解决你的问题,请参考以下文章

java中成员变量代码块构造函数运行顺序

子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法

关于C++父类与子类之间变量的问题

一文详解:Java中父子类静态块构造块构造方法成员变量之间的初始化先后顺序与执行先后顺序

(Java)类实例化过程中,父类和子类的静态变量静态代码块成员变量构造函数的执行顺序是什么?

2017/03/19学习笔记