作为(void*)传递给回调函数的继承类
Inherited class passed as (void*) to a callback function
我在使用继承和重载时遇到了意想不到的行为。或者说我做错了。
(正如这篇文章所建议的)我有一个类谁响应一个C api使用回调函数:
class APIWrapper {
protected:
// This callback is registered to a C api
static void _messageCallback(double deltatime, vector< unsigned char > *message, void *userData);
public:
void manageNewMessage(double deltatime, vector<unsigned char> *message);
};
void APIWrapper::_messageCallback(double deltatime, vector< unsigned char > *message, void *userData) {
((APIWrapper*) userData)->manageNewMessage(deltatime, message);
}
和继承第一个类的类。
class MyController : public APIWrapper {
public:
void manageNewMessage(double deltatime, vector<unsigned char> *message) {
// Customization
message.at(1) = 0;
APIWrapper::manageNewMessage(deltatime, message);
}
};
如果我声明了一个MyController
对象,则永远不会调用重载方法MyController::manageNewMessage(double, vector<unsigned char>*)
。这是正常的行为吗?
我没有看到函数是virtual
,因为您的继承方法能够通过动态绑定动态调用,它必须是祖先类中的virtual
。
virtual void manageNewMessage(double deltatime, vector<unsigned char> *message);
此外,如果APIWrapper
类的方法不应该做任何事情,那么您可以将其声明为纯虚的:
virtual void manageNewMessage(double deltatime, vector<unsigned char> *message) = 0;
通过这种方式,您可以避免在父类中声明一个空方法,最重要的是,如果您忘记(或在签名中犯任何错误)重写该方法,您的代码将不会编译。这是因为所有纯虚方法都必须在子类中实现,以便能够分配它的新实例。
相关文章:
- 以特征类型作为参数的泛型函数回调
- C# DllImport 调用非托管C++函数回调
- 为什么模板参数推导失败,std::函数回调的可变参数模板参数?
- std::包含 std::函数回调的多个包装器的向量不起作用
- 如何设置对类的私有函数的函数回调?
- 如何使用 c++11 函数回调声明多个模板参数
- sqlite3 更改函数回调参数 void* not用于 int* C++
- 如何知道 sqlite 中的函数"回调"是否返回了一些东西?
- Windows表单如何使用其他函数回调图表信息
- 如何在 c++ 结构中的 void* 变量中调用存储函数(回调)
- 将成员函数作为标准函数回调
- C++ 使用成员函数回调实现按钮
- std::函数回调,参数采用观察者模式(寄存器主题上的占位符)
- 使用可变参数模板从 Lua 函数回调 (C api) 中提取参数
- 在C++中使用派生类的静态方法作为函数回调
- 将libuv与函数结构一起使用,而不是函数回调
- 如何将函数回调传递给类成员
- c++类成员函数回调
- C++函数回调:无法从成员函数转换为函数签名
- 如何编写一个通用函数回调测试类