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

Posted

技术标签:

【中文标题】静态变量继承C ++ [重复]【英文标题】:Static variable inheritance C++ [duplicate] 【发布时间】:2018-03-10 20:30:12 【问题描述】:

我想要派生类中的静态变量,所以我想在基类中制作一些东西。基类将是虚拟的。有可能吗?

class Base 
public:
    static const int x;
    void f() 
        return x;
    
    virtual void g() = 0;
;

class Derived1 : virtual Base 
public:
    void g() 
;
const int Derived1::x = 1;

class Derived2 : virtual Base 
public:
    void g() 
;
const int Derived2::x = 2;

...

Derived1 a;
Derived2 b;
a.f() == 1; // should be true
b.f() == 2; // should be true

【问题讨论】:

你是在问如何让每个派生类都有自己的静态变量实例? @HolyBlackCat 是的 @HolyBlackCat 谢谢,我通过改写问题 ***.com/questions/1390913/… 找到了解决方案 那我把它当作骗子关闭了。 【参考方案1】:

唉,不,C++ 没有虚拟静态。您可以做的是使用非静态 getter 方法:

 class A 
      virtual const int& Foo() const = 0;
 

 class B : A 
      static int foo_;
      const int& Foo() const override  return foo_; 
 
 int B::foo_  1 ;

您可以通过使用CRTP 定义的mix-in 类“自动化”此操作:

 class A 
      virtual const int& Foo() const = 0;
 

 template <typename T>
 class FooHolder 
      static int foo_;
      const int& Foo() const override  return foo_; 
 

 class B : A, virtual FooHolder<B> 
      // other stuff
 

这样,你在子类中唯一需要做的就是指出混合继承。我可能在这里遗漏了一些虚拟继承注意事项(因为我很少使用它)。

另一个选项,如here 所述,是使A 类自身模板化,以便每个 B 都从不同的 A 继承。但这会破坏您的继承结构。

【讨论】:

【参考方案2】:

C++ 没有 virtual 成员变量的概念 -- static 或常规。它有virtual 成员函数。

最好将static成员变量封装起来,通过virtual成员函数访问。

class Base 
public:
    // static const int x;

    void f() 
       int x = getX();
       // Use x
    

    virtual int getX() = 0;
    virtual void g() = 0;
;

class Derived1 : virtual Base 
  static const int x;
  public:
    virtual int getX()  return x;
    void g() 
;
const int Derived1::x = 1;

除非有其他令人信服的理由将 Derived1::x 保留为成员变量,否则您可以将其删除并简化 Derived1

class Derived1 : virtual Base 
  public:
    virtual int getX()  return 1;
    void g() 
;

【讨论】:

使用此代码,您需要覆盖f() 以返回Derived1::x @Emadpres,感谢您的推荐。我更新了只处理x的答案。

以上是关于静态变量继承C ++ [重复]的主要内容,如果未能解决你的问题,请参考以下文章

编译失败,将静态变量作为私有成员变量的c ++程序[重复]

static关键字和继承

C中的局部静态变量范围[重复]

继承,修饰符

java中静态变量与静态方法的继承(转)

有继承关系的对象执行顺序,包括静态变量,静态代码块,普通变量,普通代码块,继承方法.