静态变量继承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 ++ [重复]的主要内容,如果未能解决你的问题,请参考以下文章