【问题标题】:Virtual method of copy of Pointer not working指针副本的虚拟方法不起作用
【发布时间】:2013-05-13 23:36:04
【问题描述】:

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

首先,一切正常,然后,我进行了一些更改以使代码更加“有条理”并在 GitHub 上共享。

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

ViewGroup 是一个扩展 View 的类,并具有从 View 覆盖的方法 HitTest。

所以,基本上:如果我调用 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

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

更新 2:

问题是由方法声明中的一个愚蠢错误引起的。 一个声明为hitTest(int x, int y),另一个声明为hitTest(long x, long y)

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

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

【问题讨论】:

  • 我已经更新了@JimBalter

标签: c++ class object pointers inheritance


【解决方案1】:

hitTest 的两个参数版本的签名不同。如果您正在使用 C++11 进行编码,请使用 override 关键字来覆盖所有虚函数……它会让您免去这种痛苦。

【讨论】:

  • 非常感谢!我永远不会看到它(在接下来的 72 小时内)=]
  • 我建议使用 C++11 中的 override 关键字。如果方法没有覆盖任何东西,它将抛出一个错误(example)。
  • 再等2分钟=]
  • @很快我在你建议的时候添加了它。
  • @IvanSeidel 你可以试试这个关键字,看看它是否接受它......甚至一些 C++11 之前的编译器也会这样做(这是关键字的来源)。
猜你喜欢
  • 2012-06-04
  • 2010-12-29
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2011-10-17
  • 2013-10-13
  • 1970-01-01
  • 2013-10-23
相关资源
最近更新 更多