作为(void*)传递给回调函数的继承类

Inherited class passed as (void*) to a callback function

本文关键字:函数 回调 继承 void 作为      更新时间:2023-10-16

我在使用继承和重载时遇到了意想不到的行为。或者说我做错了。

(正如这篇文章所建议的)我有一个类谁响应一个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;
通过这种方式,您可以避免在父类中声明一个空方法,最重要的是,如果您忘记(或在签名中犯任何错误)重写该方法,您的代码将不会编译。这是因为所有纯虚方法都必须在子类中实现,以便能够分配它的新实例。