我有这个基类:
// 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
构造函数调用它,该函数运行良好。