1

虽然我看到过多的 Stack Overflow Questions and Answers 虚函数调用类似名称的子/超类函数,但我得到了这个:

CCLog("Yay"); //ensure it's called
CCScene * tScene = TitleDescription::scene(); //grab the scene

TitleDescription * t = reinterpret_cast<TitleDescription *>(tScene); //Unsure why this even works when I think about it, a scene is returned but the below call:

t->loadWithDataFrom("Information.xml", "story"); //calls setScaleX on CCObject instead.

CCDirector::sharedDirector()->replaceScene(tScene ); //runs with an empty scene on one condition

使用 loadWithData 加载场景的条件是我将函数设为 void name(types)。我遵循 cocos2d-x 的模式并使用了 virtual,在这种情况下,它调用了 setScaleX,我使用了调试器并进入了它。

我有两个问题。

1)如果 scene() 函数返回一个场景(带有 TitleDescription 类型的子节点),那么这个调用如何运行(当非虚拟并按我想要的方式运行时,例如:调用正确的函数)?

2)当它搞砸时,vTable是否只是指向一个垃圾位置,恰好总是相同的功能?

注意:在 cocos2d(和 X)中,场景是图层的子类,是 CCObject 的子类。CCObject 确实包含被调用的函数,但名称和参数差异很大,我不明白为什么调用名称和参数完全不同的函数。

我对这方面的任何参考资料和良好的文档持开放态度。我怀疑我的演员表(设置为重新解释只是为了强制绕过所有内容),这可能是为什么虚拟函数每次运行都指向同一个函数,包括当我将签名更改为 bool 而不是 void 并清理构建时.

注意:XCode 是我所处的环境。我也不相信它使用 LLVM。我会尝试调整它,看看会发生什么。

像其他人一样,我认为我并不完全理解 vFunctions,尽管我知道抽象类的使用和强制覆盖。(作为具有该功能的第一类,我不明白为什么此时它需要是虚拟的,但由于我正在做的事情,我确实计划在子类中扩展该功能)。

谢谢,史蒂夫·J

4

1 回答 1

3

reinterpret_cast不会正确地向下转换。请记住,基础子对象可能不在完整对象的开头。

static_cast对向上转换、dynamic_cast向下转换和交叉转换使用隐式转换 dynamic_cast。它们将在需要时包含适当的偏移量,而不仅仅是返回相同的地址reinterpret_cast

而且这些都不会让你在父对象和成员(非基础)子对象之间。

完全避免演员阵容是迄今为止最好的。

于 2012-04-28T23:11:41.717 回答