基类和继承中的静态方法中的静态变量

Posted

技术标签:

【中文标题】基类和继承中的静态方法中的静态变量【英文标题】:Static variables in static method in base class and inheritance 【发布时间】:2011-02-13 18:52:54 【问题描述】:

我有这些 C++ 类:

class Base

protected:
    static int method()
    
        static int x = 0;
        return x++;
    
;

class A : public Base


;

class B : public Base


;

x 静态变量会在AB 之间共享,还是每个人都有自己独立的x 变量(这是我想要的)?

【问题讨论】:

这不是你可以用编译器和一些测试代码快速检查的吗? @ttmrichter:如果有任何怀疑,它可能与实现有关。当您检查它不是时,您已经找到了答案。 @ttmrichter 我怀疑该变量将被共享,但我也想看看是否有人有其他方法解决我的问题:) 【参考方案1】:

整个程序中只有一个x 实例。一个很好的解决方法是使用CRTP:

template <class Derived>
class Base

protected:
    static int method()
    
        static int x = 0;
        return x++;
    
;

class A : public Base<A>  ;
class B : public Base<B>  ;

这将为派生自它的每个类创建一个不同的Base&lt;T&gt;,从而创建一个不同的x

正如 Neil 和 Akanksh 指出的那样,您可能还需要一个“Baser”碱基来保留多态性。

【讨论】:

很好,你在我准备提交的时候发布了:)。 但是如果需要的话,你没有得到的是多态性。 谢谢,我忘了我在很多年前解决了一个非常相似的问题,也是用 CRTP :) @neil 多态不是必需的,我只是想避免重复代码【参考方案2】:

只有一个,由所有三个班级共享。如果您想要单独的实例,则必须在派生类中创建单独的函数。

【讨论】:

【参考方案3】:

前者。局部静态变量绑定到包含它们的方法,method 存在于所有子类的一个化身中(实际上,对于整个应用程序,即使程序的其余部分看不到该方法)。

【讨论】:

【参考方案4】:

变量将被共享 - 它是每个函数的 - 在这种情况下,它所属的函数是 Base::method()。但是,如果 class Base 是一个模板类,您将为 class Base 模板的每个实例化(每个唯一的实际模板参数集)获得一个变量实例 - 每个实例化都是一个新函数。

【讨论】:

【参考方案5】:

如果您将 X 设为静态,那么它将在所有子类之间共享。函数是静态的没有问题。

【讨论】:

【参考方案6】:

我很确定它将在 A 和 B 之间共享。

如果你想要独立变量,你可以使用“Curiously Recurring Template Pattern”,比如:

template<typename Derived>
class Base

protected:
    static int method()
    
        static int x = 0;
        return x++;
    
;

class A : public Base<A>


;

class B : public Base<B>


;

当然,如果你想要多态性,你必须定义一个基数派生的偶数“Baser”类,因为Base&lt;A&gt;Base&lt;B&gt; 不同,例如:

class Baser

;

template<typename Derived>
class Base : public Baser

protected:
    static int method()
    
        static int x = 0;
        return x++;
    
;

class A : public Base<A>
;

class B : public Base<B>
;

现在 A 和 B 也可以是多态的。

【讨论】:

以上是关于基类和继承中的静态方法中的静态变量的主要内容,如果未能解决你的问题,请参考以下文章

静态变量继承C ++ [重复]

让基类的方法使用继承类的静态成员变量......可能吗?

4月14日继承与多态

Java抽象类和接口

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承