繁体   English   中英

静态成员和继承

[英]Static member and inheritance

我有一个带有成员m_preferences的类(一个包含单词和特征之间m_preferences的向量)。

在这个类中, m_preferences不是静态的,因此该类的任何实例都有其特定的m_preferences

class Base{

private:

    Preferences m_preferences;

public:
...

}

然后我创建了一个派生类,其中m_preferences变为静态,因为我希望此类的每个新实例共享相同的首选数据,无论发生什么。

class Derived: public Base{

private:

    static Preferences m_preferences;

public:
...

}

我收到了链接错误。

是否可以做我想做的事情(通过继承将非静态成员转换为静态成员)?

如果不是这种不可能性背后的哲学是什么? 有计划吗?

谢谢,

此致

罗南

您无法阻止Base每个实例(包括Derived每个实例)拥有每个实例的Preferences成员变量,因为Base类的定义可以保证这一点。

您所做的是向Derived类添加一个新的静态Preferences成员,这意味着除了与基类关联的每个实例的Preferences成员之外,您还有一个在所有Derived实例之间共享的全局Preferences实例。

因为您对这两个成员使用了相同的名称,所以在Parent成员函数的上下文中,使用m_preferences将引用全局共享实例,除非您将其限定为Base::m_preferences

您的链接错误可能是因为您需要在其中一个翻译单元中提供Derived::m_preferences的定义。

例如在some.cpp中,在任何函数体之外:

Preferences Derived::m_preferences;

如果我正确地读你,你想要定义一个对象的层次结构,它将具有静态或个体的实例变量Preferences。 试试这个?

class Base
{
  virtual ~Base();
  virtual Preferences& MyPreferences() =0;
};

class DerivedA: public Base
{
public:
  virtual ~DerivedA();
  virtual Preferences& MyPreferences() { return m_preferences; }

private:
  Preferences m_preferences;
};

class DerivedB: public Base
{
public:
  virtual ~DerivedB();
  virtual Preferences& MyPreferences() { return preferences; }

private:
  static Preferences preferences;
};

Preferences DerivedB::preferences;

正如阿里沙菲所说的那样,“转型”是不可能的。 这里的问题是“静态”成员是类本身的属性而不是单个对象的属性,而虚拟声明和继承是关于在更高的抽象级别上统一处理可能不是同一类的单个对象。

简短回答:你没有正确使用继承。

答案很长:您将Base定义为具有单个首选项的类型。 如果Derived不符合“is-a”限定条件(Derived是一种也具有每个实例首选项的类型),那么它不应该从Base继承。

也许更好的设计(?):

class NotDerivedAnymore
{

private:

    static Base m_base;

public:
...

}

是的, 根据设计,您无法在继承成员时更改成员的签名

你正在打破is-a继承规则。

您声明Base是一种具有自己的Preferences成员的类型,并且您声明Derived Base

您的BaseDerived对象似乎共享一些特性,但不是直接继承

我相信这会得到你想要的结果

class TrueBase{ 
    // Put data and functionality here that really is common for both types.
  private:

    virtual Preferences& get_preferences() = 0;
};

class Base : public TrueBase{
  private:

    virtual Preferences& get_preferences()
    {
        return m_preferences;
    }

    Preferences m_preferences;
};


class Derived: public TrueBase{  
  private:

    virtual Preferences& get_preferences()
    {
        return m_preferences;
    }

    static Preferences m_preferences;   
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM