在C++中使用派生类的静态方法作为函数回调

Use derived class's static method as function callback in C++

本文关键字:静态方法 函数 回调 C++ 派生      更新时间:2023-10-16

我需要使用以下代码将对象的静态方法作为回调函数传递:

glutDisplayFunc(callback)

其中callback是某个类的静态方法 - baseClass::callback() .它编译得很好。但是现在我想有一个派生类baseClass作为它的父级)具有相同的回调函数 - 也就是说,我想覆盖回调函数。

我已经在派生类中覆盖了它,但derivedClass::callback()没有被调用。

附言。我在基类中调用glutDisplayFunc(callback)。代码如下所示:

baseClass::someFunction(){
    glutDisplayFunc(callback);
}

如何传递derivedClass::callback而不是baseClass::callback baseClass? 所有方法都是静态的。

C++不支持

虚拟静态方法,因此您无法直接执行尝试执行的操作。您应该能够做的是创建一个返回函数指针的非静态虚拟方法,并在派生类中重写该方法以返回指向其静态回调方法的指针。

即像这样:

class A
{
public:
   typedef void(*CallbackFunction)(void);
public:
   static void callback(void)
   {
      std::cout << "A::callback" << std::endl;
   }
   virtual CallbackFunction getCallback()
   {
      return callback;
   }
   void someFunction()
   {
      glutDisplayFunc(getCallback());
   }
};
class B: public A
{
public:
   static void callback(void)
   {
      std::cout << "B::callback" << std::endl;
   }
   CallbackFunction getCallback()
   {
      return callback;
   }
};

不完全理想,但对于不支持上下文参数的 C 回调来说,这是一个不错的解决方法。

简短的回答是你不能,而且你通常不想这样做。基类通常不应直接了解特定的派生函数。

通常的模式是在基类中有一个调用虚函数的静态函数,然后重写派生类中的虚函数。我不确定这是否适用于这里 - 要工作,您需要能够将参数传递给回调函数。您传递的参数是指向对象的指针,因此将其强制转换为基对象类型,然后从该指针调用正确的虚函数。

然而,在 glutDisplayFunc 的特定情况下,我认为这是不可能的——它不允许你获取传递给回调函数的参数。如果你想做这种风格的编程,恐怕除了切换到 GLUT 以外的东西之外,没有真正的治疗方法。