Pointer副本的虚拟方法不起作用

时间:2013-05-19 06:42:41

标签: c++ class object pointers inheritance

我遇到了在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

     

View.h:https://www.dropbox.com/s/tcrb75dmx3v6pgq/View.h

     

View.cpp:https://www.dropbox.com/s/4sb82d6thqz34od/View.cpp

更新2:

问题是由于方法声明上的一个愚蠢错误造成的。 其中一个被声明为hitTest(int x, int y),另一个被声明为hitTest(long x, long y)

在“清理”和改进代码时发生。

但是,它非常奇怪,因为它在我复制对象之前工作,并且在复制之后,不再是......

1 个答案:

答案 0 :(得分:5)

hitTest的双参数版本的签名是不同的。如果您正在使用C ++ 11进行编码,请对所有虚拟函数覆盖使用override关键字......它将为您带来这种悲伤。