繁体   English   中英

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

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

编辑 :下面的例子作为的思想工作。 对于这个问题, 史蒂夫·杰索普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的项目。 BaseCCObjectDerivedADerivedB是子类CCLayer

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

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->*pCallbacknew返回一个不能用于初始化db的指针,但是缺少一些半符号-冒号,也许还有我错过的其他问题。 编写一个简短的程序,将其编译,发布并询问有关该程序的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM