0

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

(正如这篇文章所建议的)我有一个类使用回调函数响应 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>*)这是正常行为吗?

4

1 回答 1

3

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

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

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

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

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

于 2013-05-01T22:04:55.617 回答