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

时间:2013-05-01 22:01:42

标签: c++ inheritance

我正面临使用继承和重载的意外行为。 或者说我做错了。

(如this post中所述) 我有一个使用回调函数响应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>*)。 这是正常行为吗?

1 个答案:

答案 0 :(得分:3)

我没有看到函数是virtual,因为你的继承方法能够通过动态绑定动态调用它在祖先类中必须是virtual

virtual void manageNewMessage(double deltatime, vector<unsigned char> *message);

此外,如果APIWrapper类的方法不应该做任何事情,那么你可以将它声明为纯虚拟:

virtual void manageNewMessage(double deltatime, vector<unsigned char> *message) = 0;

通过这种方式,您可以避免在父类中声明一个空方法,最重要的是,如果您忘记(或在签名中出错)覆盖该方法,您的代码将无法编译。这是因为所有纯虚方法都必须在子类中实现才能分配它的新实例。