C++ 如何在继承级别的多个实例之间共享相同的数据?

C++ 如何在继承级别的多个实例之间共享相同的数据?,c++,inheritance,static,C++,Inheritance,Static,我想实例化具有相同继承级别的多个对象,并为每个继承级别使用相同的数据。所以我考虑类的继承和静态成员 这是我的: 在我的示例中,两个Child1实例都应该使用GetValue返回10,而两个Child2实例都应该使用GetValue返回20。由于函数是相同的,我不想为每个孩子重写它,这就是为什么我把它放在父亲中 问题是Child1实例也返回20个调用GetValue的实例 因此,静态是在主父级而不是子级之间共享的 由于该sValue值用于GetValue,因此将其放置在此处是正确的。但我不能这样分

我想实例化具有相同继承级别的多个对象,并为每个继承级别使用相同的数据。所以我考虑类的继承和静态成员

这是我的:

在我的示例中,两个Child1实例都应该使用GetValue返回10,而两个Child2实例都应该使用GetValue返回20。由于函数是相同的,我不想为每个孩子重写它,这就是为什么我把它放在父亲中

问题是Child1实例也返回20个调用GetValue的实例

因此,静态是在主父级而不是子级之间共享的

由于该sValue值用于GetValue,因此将其放置在此处是正确的。但我不能这样分离静态/相同的数据

您将如何做到这一点?

当您调用child1\u 1.sValue=1时,您正在修改父::sValue;和child2_1.s值=2;有一个实例,它属于父类,因此您可以通过一个方法对类或实例进行访问,在调用GetValue之前,您将获得它设置为的任何值


如果您想要一个Child1和Child2版本,那么可以向这些类添加静态成员和方法。

我认为您需要的是以下内容:

class Father
{
public:
    inline int GetValue() { return DoGetValue() * 10; }
    void SetValue( int value ) { DoSetValue( value ); }

protected:
    virtual int DoGetValue() = 0;
    virtual void DoSetValue( int value ) = 0;
};


class Child1 : public Father
{
public:
    static int sValue;

protected:
    int DoGetValue() override { return sValue; }
    void DoSetValue( int value ) override { sValue = value; }
};

class Child2 : public Father
{
public:
    static int sValue;

protected:
    int DoGetValue() override { return sValue; }
    void DoSetValue( int value ) override { sValue = value; }
};

int Child1::sValue = 0;
int Child2::sValue = 0;

int main()
{
    Child1 child1_1;
    Child1 child1_2;
    Child2 child2_1;
    Child2 child2_2;    


    child1_1.SetValue( 1 );
    child2_1.SetValue( 2 );    

    std::cout << child1_2.GetValue() << std::endl;
    std::cout << child2_2.GetValue() << std::endl;
}  

splrs用户已正确识别您的问题,并且解决方案是正确的。您需要两个具有两个不同静态对象的不同函数。通过使用模板,可以避免重复代码:

template<class Child>
struct Father {
    static int sValue;
    int GetValue() { /* ... */ }
};

struct Child1 : Father<Child1> {};
struct Child2 : Father<Child2> {};

在每个派生类中放置静态成员?@LogicStuff:否,否则我不能在GetValue中使用sValue,这是一个常见的函数…然后创建一个虚拟函数GetSValue,将在GetValue中使用。只需为子类创建一个构造函数,并在创建对象实例时初始化子对象的sValue。确保svalue不是静态的。@paizza,这样它就不会工作了。请阅读我的帖子。如果我这样做,GetValue就不能运行,这是一个必须使用的公共函数。这是非常冗余的。如果我有20个变量而不是1个值,我需要为每个继承重新声明它20次。每个getter/setter都相同。我想我会尝试一些手术。@paizza也许你想做一些不可能的事情。或者至少我不知道,这是我的本意。它有时会说:另外,使信封生成器的stageValue保持静态意味着卷和过滤器信封总是相同的。这可以通过继承来解决:我们可以创建一个VolumeDevelop和FilterDevelop类,并从EnvelopeGenerator继承这两个类。stageValue可以是静态的,VolumeDevelope和FilterDevelope都可以覆盖它。覆盖静态成员意味着什么?不确定你在用struct做什么。我需要上课。所有子类的唯一函数,每个派生级别类的共享静态函数。你能举个例子吗?@paizza a struct是一个类。我使用它来保持示例简洁。但是如果您愿意,可以使用class关键字。每个子类都有自己的静态成员,从模板化父类继承,是的。这些例子在我的回答中。
template<class Child>
struct Father {
    static int sValue;
    int GetValue() { /* ... */ }
};

struct Child1 : Father<Child1> {};
struct Child2 : Father<Child2> {};
struct FatherBase {};

template<class Child>
struct Father : FatherBase { /*...*/ };
struct FatherBase {
    virtual int GetValue() = 0;
};

template<class Child>
struct Father : FatherBase {
    // ...
    int GetValue() override { /* ... */ }
};