私はこの基本クラスを持っています:
// 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
を削除すると正常に動作し、 が表示されますが、このメソッドの派生クラスの実装にはアクセスできません。この奇妙な動作の原因と、それを回避するために何ができるかを理解したい.virtual
f_focus()
0
編集:
Gadget
コンストラクターから呼び出すと、関数は正常に実行されます。