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/调试模式)好吧,但我想知道这是否坏(TM) -为什么?(我还没有用Android和iOS的编译器测试这段代码)。
Base
是CCObject
, DerivedA
和DerivedB
是CCLayer
的子类。
层次结构是DerivedA
和DerivedB
<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
的指针,有一些缺失的分号,也许我错过了其他问题。编写一个编译的短程序,张贴出来,并询问有关该程序的问题。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 当使用通配符和null指针调用函数时,对输出的说明
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 使用基类指针调用基类的值构造函数的语法是什么?
- 是否可以使用函数指针调用虚拟析构函数?
- 使用C++指针调用 python 函数
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- 从带有参数的基函数指针调用基方法
- 使用唯一指针调用函数会使我的程序崩溃
- C++::在构造函数退出之前通过指针调用成员函数
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 什么时候用指针调用C++类构造函数
- C++ - 使用变量指针调用函数
- 为什么我可以通过野生指针调用成员函数
- 从指针调用方法时出现分段错误
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- C++ abort() 在函数内的抽象类对象指针调用上