静态变量继承C++

Static variable inheritance C++

本文关键字:C++ 继承 变量 静态      更新时间:2023-10-16

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

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

唉,不,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 定义的混合类"自动化"此操作:

 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
 }

这样,在子类中唯一需要做的就是指示混合继承。我在这里可能缺少一些虚拟继承警告(因为我很少使用它(。

此处描述的另一种选择是使类A本身模板化,以便每个 B 都继承自不同的 A。但这会破坏你的继承结构。

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() {}
};