虽然我看到过多的 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