在C++中使用派生类的静态方法作为函数回调
Use derived class's static method as function callback in C++
我需要使用以下代码将对象的静态方法作为回调函数传递:
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 以外的东西之外,没有真正的治疗方法。
相关文章:
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 常量静态成员函数:有另一种方法可用吗?
- 这是重载提供与非静态成员函数相同接口的静态成员函数的优雅方法吗?
- 从静态方法调用静态函数指针
- 简化静态成员函数调用的方法
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- C 模板,静态方法和构造函数
- 在静态方法内部使用函数时,会出现LNK2019未解析的外部
- 正在构造函数中调用静态方法
- 将对象的方法指针传递给接受 [静态方法指针/全局函数] 指针的函数
- 使用std::函数从任何对象调用非静态方法
- 在cuda中使用静态成员函数模板结构的另一种方法
- 如果我将所有函数都作为类的静态方法,这是一个好主意
- 是否可以从 cpp 中定义的静态方法调用私有构造函数
- 为什么我们在C++的单例模式中使用静态方法和静态函数
- 使用尽可能少的代码将非静态方法包装到 std::函数中"this"并绑定参数
- 访问静态成员函数中的非静态成员的解决方法
- 在最终类中调用静态方法的静态基构造函数的设计模式
- 在C++中使用派生类的静态方法作为函数回调