![](/img/trans.png)
[英]C++: call (derived's) member function on base pointer of a different derived class's object
[英]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的项目。 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中 。
您甚至无法使用&DerivedA::doSomethingStaticA
初始化pCallback
,因为指向静态成员函数的指针实际上是函数的指针,而不是成员函数的指针。
因此,即使您的示例代码也很糟糕;-)同样, b->pCallback
可能应该是b->*pCallback
, new
返回一个不能用于初始化db
的指针,但是缺少一些半符号-冒号,也许还有我错过的其他问题。 编写一个简短的程序,将其编译,发布并询问有关该程序的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.