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

时间:2013-04-16 16:03:25

标签: c++ cocos2d-x

修改:以下示例按照预期工作。对于问题,Steve Jessop的答案是正确的。已使用更正的示例创建new question。根据社区规则,可能会删除该问题。或者可以将主体缩短为“是否可以在基类的指针上调用静态成员函数(指针)?”以下示例匹配答案。示例下方的更多细节(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的项目。 BaseCCObjectDerivedADerivedBCCLayer的子类。

层次结构为DerivedADerivedB< CCLayer< CCNode< CCObject

DerivedA有一个不同的静态函数来设置音乐播放,它接收CCNode来电者对象作为参数,schedules另一个selector doSomethingStaticA )开始播放并使用以下内容慢慢淡化它:

callerNode->schedule(schedule_selector(DerivedA::doSomethingStaticA), 0.05f);

doSomethingStaticA执行such as

之类的操作
CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(sFadeMusicVolume);

在运行时对doSomethingStaticA的调用发生在CCTimer::update

1 个答案:

答案 0 :(得分:1)

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

所以有些东西是坏的,即使只是你的示例代码;-)同样b->pCallback也许应该是b->*pCallbacknew返回一个不能用于初始化的指针db,有一些缺失的冒号,也许还有其他我错过的问题。编写一个简短的程序,编写,发布并询问有关该程序的问题。