0

私はこの基本クラスを持っています:

// put the display in a macro on a .h file for less headache.
class Gadget {
  protected:
    int x, y;
    U8GLIB * u8g;

    virtual int  f_focus()  {return 0;};
    virtual int  f_blur()   {return 0;};
    virtual void f_draw()   {};
    virtual void f_select() {};


  public:
    Gadget(U8GLIB * u8g, int x, int y) :
      u8g(u8g),
      x(x),
      y(y)
    {
      Serial.println(F("Gadget(U8GLIB * u8g, int x, int y)"));
    };

    Gadget() {
      Serial.println(F("Gadget()"));
    };

    int     focus(){return f_focus();};
    int     blur(){return f_blur();};
    void    draw(){f_draw();};
    void    operator()(){f_select();};
};

そして、この派生クラス:

class WakeUp :
  public Gadget
{
  public:
    WakeUp(U8GLIB * u8g) :
      Gadget(u8g, 0, 0)
    {
      Serial.println(F("WakeUp(U8GLIB * u8g)"));
    };

};

次に、次のように配列内で WakeUp クラスをインスタンス化します。

Gadget gadgets[1] = {
  WakeUp(&u8g)
};

次に、次のようにこのメンバーにアクセスしようとします。

void focus() {
  Serial.println(gadgets[0].focus());
}  

と表示されるはず0です。しかし、それは表示されてい-64ます。クラスのf_focus()メソッドをオーバーライドしても。指定子WakeUpを削除すると正常に動作し、 が表示されますが、このメソッドの派生クラスの実装にはアクセスできません。この奇妙な動作の原因と、それを回避するために何ができるかを理解したい.virtualf_focus()0

編集:

Gadgetコンストラクターから呼び出すと、関数は正常に実行されます。

4

1 に答える 1