如何实现虚函数的回调?

dr_*_*_rk 1 c++ polymorphism wxwidgets design-patterns

我正在使用wxWigets,但我想这个问题更多的是如何实现虚函数的回调.这是我的代码的(非常)简化版本:

// MyGUI.h 
Class MyGUI : public wxFrame {

  ...
  protected:
     virtual void onFeedButton_cb( wxCommandEvent& event ) { event.Skip(); }
  ...
}

// Animal.h 
Class Animal {

  public: 
       void Feed(); 
}
Run Code Online (Sandbox Code Playgroud)

一个小问题:我如何实现onFeedButton_cb回调,以便它可以访问Animal的Feed()函数?即在运行时,回调必须能够访问Animal的实例.

Bil*_*eal 5

定义一个为您调用虚函数的非虚函数,并将非虚函数附加到回调.

#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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这种转换正是std::mem_funSTL仿函数的涵盖范围,尽管它依赖于编译时而不是运行时多态性.