我遇到了在C ++上覆盖方法的问题
首先,一切正常,然后,我做了一些更改,以使代码更“有条理”并在GitHub上分享。
在做了一些OO更改之后,为了方便并使其更容易理解,我的代码停止了工作,并且因为一个非常奇怪的事情。
ViewGroup
是一个扩展View
的类,其方法HitTest覆盖View
。
所以,基本上:如果我调用hitTest,我必须在ViewGroup上运行(如果它是ViewGroup),或者在View上运行;
好吧,我把virtual
放在我的方法上,如果我在我的ViewGroup上运行,它实际上是从ViewGroup运行hitTest,
但是,如果我创建一个新指针并尝试运行,它就不再在ViewGroup上运行hitTest,它在View上运行。为了便于理解:
ViewGroup *v = new ViewGroup();
View *t = v;
v->hitTest(100,100); // Runs on ViewGroup (OK)
t->hitTest(100,100); // Runs on View (NOT OK)
更新
ViewGroup.h:https://www.dropbox.com/s/a3lqbm73qlxds3i/ViewGroup.h
ViewGroup.cpp:https://www.dropbox.com/s/vxbqsh6ol430x4p/ViewGroup.cpp
更新2:
问题是由于方法声明上的一个愚蠢错误造成的。
其中一个被声明为hitTest(int x, int y)
,另一个被声明为hitTest(long x, long y)
。
在“清理”和改进代码时发生。
但是,它非常奇怪,因为它在我复制对象之前工作,并且在复制之后,不再是......
答案 0 :(得分:5)
hitTest的双参数版本的签名是不同的。如果您正在使用C ++ 11进行编码,请对所有虚拟函数覆盖使用override关键字......它将为您带来这种悲伤。