Ваша проблема в том, что указатель на функцию-член не совсем совпадает с указателем на функцию-голую. На самом деле это не просто указатель, а значительно более сложная структура , которая различается в деталях на уровне реализации компилятора. Когда вы вызываете его через синтаксис (this->*fp)()
, вы фактически вызываете его для исходного объекта, что вызывает диспетчеризацию виртуальной функции.
Единственное, что может сработать, - привести его к типу указателя, не являющегося методом. Это немного скрипит, но я думаю это должно сработать. Вам все еще нужно передать Base *
, но вы делаете это явно, и отправка виртуальной функции игнорируется:
typedef void BasePointer(Base*);
void callFunc()
{
BasePointer fp = (BasePointer *)&Base::func;
fp(this);
}
Обновление: Хорошо, нет, вы не можете сделать это таким образом. Это незаконно и не будет безопасно, если это будет законно. C ++ FAQ содержит больше об этом . Но зная, что это не решит вашу проблему. Проблема в том, что указатель на объект или указатель на член, если вы хотите вызвать Base::func
через Base
указатель, объект, на который он указывает, должен также быть Base
. Если вы можете это организовать, то можете использовать указатель на функцию-член.
Вот еще одна мысль, не красивая, но, по крайней мере, осуществимая. Укажите в Derived
функцию, не являющуюся виртуальной, которая явно вызывает Base::func
. Вместо этого укажите на это. Он не будет масштабироваться, если вам нужно сделать это в общем случае множества различных вариантов func
и callFunc
, но он будет хорошо работать для одного метода.