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

Iva*_*del 0 c++ inheritance pointers class object

我在使用C++上的Overriding方法时遇到问题

首先,一切正常,然后,我做了一些更改,以保持代码更"有条理",并在GitHub上分享.

在做了一些OO更改之后,为了方便并使其更容易理解,我的代码停止了工作,并且因为一个非常奇怪的事情.

ViewGroup是一个扩展的类View,并具有HitTest重写的方法View.

所以,基本上:如果我调用hitTest,我必须在ViewGroup上运行(如果它是ViewGroup),或者在View上运行;

好吧,我把它virtual放在我的方法上,如果我DIRECLY在我的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)
Run Code Online (Sandbox Code Playgroud)

更新:

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).

它发生在"清理"和改进代码时.

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

Jim*_*ter 5

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

  • 我建议使用C++ 11中的`override`关键字.如果方法没有覆盖任何内容,它将抛出错误([示例](http://coliru.stacked-crooked.com/view?id=db3e609d635bb06ba455c1e701572318-7f4bc2c90970fdf19c48ebf8cc2bae3f)). (2认同)