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