C++修改超类中声明的实例变量

C++ Modifying Instance Variable Declared in Superclass

本文关键字:实例 变量 声明 修改 超类 C++      更新时间:2023-10-16

我的C++应用程序中有几个类的结构如下:

           /- RedFixture
 Fixture --
           - BlueFixture

因此,fixture基类有两个子类。

我想在基类中封装一些常见的功能,并存储一些常见的属性。一个例子是一个简单的整数,我们称之为"current"。基类声明如下:

class Fixture
{
  public:
    int current;
    Fixture();
    virtual void loop();
    int next();
    int prev();
};

下一个和前面的方法都非常简单,从字面上讲是由一些条件和current++current--组成的。

在代码的其他地方,我有一个指向Fixture的指针,尽管该指针的实际类型可能是RedFixtureBlueFixture。当我调用fixture->next()时,我没有看到currentRedFixtureBlueFixtureloop()实现中发生变化。

RedFixture/BlueFixture声明如下:

#ifndef RedFixture_H
#define RedFixture_H
#include "Fixture.h"
class Animation;
class RedFixture : public Fixture {
  public:    
    /**
     * Construct a new fixture
     */
    RedFixture();
    /**
     * Setup the fixture and perform any initialization necessary
     */
    virtual void setup();
    /**
     * Perform the loop
     */
    virtual void loop();
};
#endif

RedFixture/BlueFixture实现loop()的示例,其中我访问current变量:

void RedFixture::loop()
{
  Animation *currentAnim = animations.at(current);
  currentAnim->animate(leds);
}

在代码的其他地方,我有这样的东西:

Fixture *fixture = fixtures.at(0);
fixture->next();

我希望current属性会增加,并在下次调用loop()时反映出来,但事实并非如此。相反,current变量似乎没有变化。

鉴于我是C++的新手,我是否误解了继承的工作原理?即使我使用多态性并在类型为Fixture的指针上调用next()prev()current计数器难道不应该被正确修改吗?

打印以下代码:

Nothing
1

希望这能回答您关于多态性的一些问题,以及多态性与代码之间的关系。很抱歉,如果我破坏了你函数的预期目的,但只是想给你一些上下文。

#include <iostream>
using namespace std;
class Fixture{
public:
    int current = 0;
    virtual void loop(){ 
        cout << "Nothing" << endl;
    }
    void next(){
        current++;
    }
};

class AwesomeFixture : public Fixture{
    public:
        void next(){
            // Do nothing
            cout << "Nothing" << endl;
        }
        virtual void loop(){
            next();
        }
};
int main(int argc, char * argv[]){
    Fixture * fixture = new AwesomeFixture();
    fixture->loop();
    fixture->next();
    cout << fixture->current << endl;
    return 0;
}