我需要使用以下代码将对象的静态方法作为回调函数传递:
glutDisplayFunc(callback)
callback
是某个类的静态方法 - baseClass::callback()
。它汇编得很好。但是现在我想要一个派生类(拥有baseClass
,因为它的父级)具有相同的回调函数 - 也就是说,我想覆盖回调函数。
我在derivedClass中覆盖了它,但derivedClass::callback()
没有被调用。
PS。我正在用基类调用glutDisplayFunc(callback)
。代码如下:
baseClass::someFunction(){
glutDisplayFunc(callback);
}
如何使用derivedClass::callback
方法传递baseClass::callback
而不是baseClass?
所有方法都是静态的。
答案 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回调来说,这是一个不错的解决方法。