Изменить: приведенный ниже пример не работает так, как предполагалось. На этот вопрос правильный ответ Стива Джессопа. Создан новый вопрос с исправленным примером. Вопрос может быть удален в зависимости от правил сообщества. Или тело может быть сокращено до «Можно ли вызвать статическую функцию-член (указатель) для указателя базового класса?» с примером ниже, чтобы соответствовать ответу. Раздел более подробная информация (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) хорошо, но мне интересно, плохо ли это (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 а>.