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

C++: call static member function on base pointer of different class's derived object

本文关键字:指针 调用 函数 静态成员 派生 同类 C++ 对象      更新时间:2023-10-16

编辑:下面的示例像想象的那样工作。对于这个问题,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/调试模式)好吧,但我想知道这是否坏(TM) -为什么?(我还没有用Android和iOS的编译器测试这段代码)。

如果需要,我正在构建一个基于cocos2d-x的项目。BaseCCObject, DerivedADerivedBCCLayer的子类。

层次结构是DerivedADerivedB <CCLayer _x002E_=">

DerivedA有一个不同的静态函数来设置音乐的播放,它接收CCNode调用者对象作为参数,并安排另一个选择器(doSomethingStaticA)开始播放并慢慢淡出,使用如下:

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

doSomethingStaticA做的事情如

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

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

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

所以有些东西是坏的,即使只是你的示例代码;-)b->pCallback可能应该是b->*pCallback, new返回一个不能用于初始化db的指针,有一些缺失的分号,也许我错过了其他问题。编写一个编译的短程序,张贴出来,并询问有关该程序的问题。