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

时间:2012-04-08 07:21:07

标签: c++

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

glutDisplayFunc(callback)

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

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

PS。我正在用基类调用glutDisplayFunc(callback)。代码如下:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

然而,在glutDisplayFunc的特定情况下,我不相信这是可能的 - 它不允许您将参数传递给回调函数。我担心如果你想做这种编程风格,除了转换到GLUT之外的其他东西之外没有真正的解决办法。

答案 1 :(得分:2)

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回调来说,这是一个不错的解决方法。