静态成员和继承

时间:2009-05-24 08:49:26

标签: c++ inheritance static

我有一个成员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:
...

}

我收到了链接错误。

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

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

谢谢,

此致

罗南

5 个答案:

答案 0 :(得分:6)

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

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

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

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

e.g。在some.cpp中,在任何函数体之外:

Derived::m_preferences

答案 1 :(得分:4)

如果我正确地读你,你想要定义一个对象的层次结构,它将具有静态或个体的实例变量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;

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

答案 2 :(得分:4)

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

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

也许更好的设计(?):

class NotDerivedAnymore
{

private:

    static Base m_base;

public:
...

}

答案 3 :(得分:1)

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

答案 4 :(得分:1)

您违反了 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;   
};