我正面临使用继承和重载的意外行为。 或者说我做错了。
(如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>*)
。
这是正常行为吗?
答案 0 :(得分:3)
我没有看到函数是virtual
,因为你的继承方法能够通过动态绑定动态调用它在祖先类中必须是virtual
。
virtual void manageNewMessage(double deltatime, vector<unsigned char> *message);
此外,如果APIWrapper
类的方法不应该做任何事情,那么你可以将它声明为纯虚拟:
virtual void manageNewMessage(double deltatime, vector<unsigned char> *message) = 0;
通过这种方式,您可以避免在父类中声明一个空方法,最重要的是,如果您忘记(或在签名中出错)覆盖该方法,您的代码将无法编译。这是因为所有纯虚方法都必须在子类中实现才能分配它的新实例。