C++ C++;:在不同类的基指针上调用静态成员函数';s派生对象

C++ C++;:在不同类的基指针上调用静态成员函数';s派生对象,c++,cocos2d-x,C++,Cocos2d X,编辑:下面的示例不符合预期。这个问题的答案是正确的。已使用更正的示例创建了。根据社区规则,该问题可能会被删除。或者主体可以缩短为“是否可以调用基类指针上的静态成员函数(指针)”,下面的示例与答案匹配。示例下面的更多细节(cocos2d-x)部分可能会被删除 调用基类指针上的静态成员函数(指针)是否“安全”(和/或可移植),但对象是不同的派生类 class Base { /* ... */ } class DerivedA : public Base { /* ... */ s

编辑:下面的示例不符合预期。这个问题的答案是正确的。已使用更正的示例创建了。根据社区规则,该问题可能会被删除。或者主体可以缩短为“是否可以调用基类指针上的静态成员函数(指针)”,下面的示例与答案匹配。示例下面的更多细节(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模式下)正常工作,但我想知道这是否不好(TM)-为什么?(我还没有用Android和iOS的编译器测试这段代码)

如果需要,可以提供更多细节:我正在构建一个基于Web的项目
Base
是,
DerivedA
DerivedB
是的子类

层次结构是
DerivedA
DerivedB
<<

DerivedA
有一个不同的静态功能,用于设置音乐的播放,该功能接收调用者对象作为参数,另一个(
doSomethingStaticA
)用于开始播放,并使用如下方式缓慢淡入:

callerNode->schedule(schedule_selector(DerivedA::doSomethingStaticA), 0.05f);
doSomethingStaticA
做的事情如下


运行时调用
doSomethingStaticA
发生在。

您甚至不能使用
&DerivedA::doSomethingStaticA
初始化
pCallback
,因为指向静态成员函数的指针实际上是指向函数的指针,而不是指向成员函数的指针

所以有些东西不好,即使只是示例代码;-)另外,
b->pCallback
可能应该是
b->*pCallback
new
返回一个无法用于初始化
db
的指针,缺少一些分号,可能还有我遗漏的其他问题。编写一个简短的编译程序,发布它,并询问有关该程序的问题

CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(sFadeMusicVolume);