0

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

glutDisplayFunc(callback)

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

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

PS。我打电话glutDisplayFunc(callback)给基类。代码如下:

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

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

4

2 回答 2

2

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

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

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

于 2012-04-08T07:34:54.360 回答
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 回调来说,这是一个不错的解决方法。

于 2012-04-08T07:41:13.820 回答