C++ 指针副本的虚拟方法不工作

C++ 指针副本的虚拟方法不工作,c++,class,object,pointers,inheritance,C++,Class,Object,Pointers,Inheritance,我在C上重写方法时遇到问题++ 首先,一切都很好,然后,我做了一些更改,使代码更“有序”,并在GitHub上共享 在做了一些OO更改之后,为了方便理解,我的代码停止了工作,因为一件非常奇怪的事情 ViewGroup是一个扩展了View的类,它具有来自View的HitTest覆盖方法 因此,Basicali:如果我调用hitTest,我必须在视图组(如果它是一个视图组)或视图上运行 没关系,我把virtual放在我的方法上,如果我直接在我的ViewGroup上运行,它实际上会从ViewGroup上

我在C上重写方法时遇到问题++

首先,一切都很好,然后,我做了一些更改,使代码更“有序”,并在GitHub上共享

在做了一些OO更改之后,为了方便理解,我的代码停止了工作,因为一件非常奇怪的事情

ViewGroup
是一个扩展了
View
的类,它具有来自
View
的HitTest覆盖方法

因此,Basicali:如果我调用hitTest,我必须在视图组(如果它是一个视图组)或视图上运行

没关系,我把
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:

ViewGroup.cpp:

视图h:

View.cpp:

更新2:

这个问题是由方法声明上的一个愚蠢错误引起的。 一个被声明为
hitTest(intx,inty)
,另一个被声明为
hitTest(long x,long y)

它发生在“清理”和改进代码的过程中


但是,这很奇怪,因为它在我复制对象之前工作,而在复制之后,就不再工作了…

hitTest的两个参数版本的签名是不同的。如果您正在编写C++11,请对虚拟函数的所有重写使用override关键字。。。这会让你省去这种悲伤。

hitTest的两个参数版本的签名是不同的。如果您正在编写C++11,请对虚拟函数的所有重写使用override关键字。。。这会让你免于这种悲伤。

我更新了@jimbalter我更新了@jimbalter谢谢!我永远不会看到它(在接下来的72小时内)=]我建议使用C++11中的
override
关键字。如果方法不重写任何内容(),它将抛出一个错误。只需等待2分钟=]@很快我就在你建议时添加了它。@IvanSeidel你可以试试关键字,看看它是否接受它。。。甚至一些C++11之前的编译器也会这样做(这就是关键字的来源)。非常感谢!我永远不会看到它(在接下来的72小时内)=]我建议使用C++11中的
override
关键字。如果方法不重写任何内容(),它将抛出一个错误。只需等待2分钟=]@很快我就在你建议时添加了它。@IvanSeidel你可以试试关键字,看看它是否接受它。。。甚至一些C++11之前的编译器也会这样做(这就是关键字的来源)。