Определите не виртуальную функцию, которая вызывает для вас виртуальную функцию, и прикрепите не-виртуальную функцию к обратному вызову.
#include <memory>
#include <iostream>
class Animal { virtual void Roar() { std::cout << "Roar!\n"; } };
class Rabbit : public class Animal { virtual void Roar() {
std::cout << "Rabbits don't roar, silly!\n"; } };
typedef void (*NonVirtualCallbackType)(Animal *);
void Callback(Animal *foo)
{
//Virtual call happens inside the callback
foo->Roar();
}
void FunctionUsingCallback(NonVirtualCallbackType callback, Animal *instance)
{
callback(instance);
}
int main()
{
std::unique_ptr<Animal> generals(new Animal());
std::unique_ptr<Animal> wabbits(new Rabbit());
FunctionUsingCallback(Callback, generals);
FunctionUsingCallback(Callback, wabbits);
}
Обратите внимание, что этот вид преобразования - это именно то, что делает std::mem_fun
под прикрытиями для функторов STL, хотя это зависит от времени компиляции, а не от полиморфизма времени выполнения.