编辑:下面的例子不像想象的那样工作。对于这个问题,Steve Jessop的回答是正确的。已使用更正示例创建了一个新问题。根据社区规则,该问题可能会被删除。或者正文可以缩短为“是否可以在基类的指针上调用静态成员函数(指针)?” 用下面的例子来匹配答案。示例下方的更多细节(cocos2d-x)部分可能会被删除。
在基类的指针上调用静态成员函数(指针)是否“安全”(和/或可移植),但对象是不同的派生类。
class Base { /* ... */ }
class DerivedA : public Base {
/* ... */
static void doSomethingStaticA(float f);
}
class DerivedB : public Base { /* ... */ }
typedef void (Base::*SEL_SCHEDULE)(float);
SEL_SCHEDULE pCallback = (&DerivedA::doSomethingStaticA);
DerivedB db = new DerivedB();
Base *b = &db;
/* pCallback and b are saved in a list elsewhere (a scheduler) which calls */
b->pCallback(0.f);
这似乎工作(在 MSVC/Debug 模式下)没问题,但我想知道这是否是 Bad (TM) - 为什么?(我尚未使用 Android 和 iOS 的编译器测试此代码)。
如果需要,请提供更多细节:我正在构建一个基于cocos2d-x的项目。Base
是CCObject
,DerivedA
并且DerivedB
是 的子类CCLayer
。
层次结构是DerivedA
和DerivedB
< CCLayer
< CCNode
< CCObject
。
DerivedA
有一个不同的静态函数来设置音乐的播放,它接收一个CCNode
调用者对象作为参数并安排另一个选择器(doSomethingStaticA
)开始播放并使用类似的东西慢慢淡入:
callerNode->schedule(schedule_selector(DerivedA::doSomethingStaticA), 0.05f);
doSomethingStaticA
做诸如此类的事情
CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(sFadeMusicVolume);
运行时调用doSomethingStaticA
发生在CCTimer::update中。