【发布时间】:2013-02-19 15:38:16
【问题描述】:
我有基类Object 和Event
class Object
{
//...
};
class Event
{
};
还有一个函数指针的类型定义
typedef void (Object::*PF) (Event*);
还有一个存储两个指针的无关类
class Dispatcher
{
public:
Dispatcher (Object* obj, PF pf) : _obj (obj), _pf (pf)
void call (Event* event)
{
_obj->*pf (event);
}
Object* _obj;
PF _pf;
};
然后我有一个具体的对象和一个具体的事件
class ConcreteEvent : public Event
{
};
class ConcreteObject : public Object
{
public:
void handle (ConcreteEvent* event)
{
// Do something specific for ConcreteEvent
}
};
然后这样称呼它
ConcreteObject* obj = new ConcreteObject();
Dispatcher dispatcher (obj, static_cast<PF>(&ConcreteObject::handle));
ConcreteEvent* event = new ConcreteEvent ();
dispatcher.call (event);
我保证调度器总是会被正确的事件调用,即当它封装的函数指针实际上采用SomeOtherConcreteEvent时,我不会调用调度器并传递它ConcreteEvent
问题是:这能保证有效吗?在 linux 和 mingw 上的 gcc 4.7 中肯定可以正常工作。
【问题讨论】:
标签: c++ member-function-pointers upcasting