指针副本的虚方法不工作

Virtual method of copy of Pointer not working

本文关键字:工作 方法 副本 指针      更新时间:2023-10-16

我在c++上有一个重写方法的问题

首先,一切工作正常,然后,我做了一些改变,使代码更"有组织"。并在GitHub上分享。

在做了一些面向对象的修改之后,为了方便和使它更容易理解,我的代码停止工作了,因为一件非常奇怪的事情。

ViewGroup是一个扩展了View的类,并且具有从View重写的方法HitTest。

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

那好吧,我把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)

它发生在"清洁"时。和改进代码。

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

两个参数版本的hitTest的签名是不同的。如果你在c++ 11中编写代码,对所有虚函数的重写都使用override关键字……它将使你免于这种痛苦。