覆盖和隐藏虚拟功能
我有这样的代码:覆盖和隐藏虚拟功能
class Event{};
class CustomEvent:public Event{};
class Handler
{
public:
virtual void inform(Event e){}
};
class CustomHandler : public Handler
{
public:
void inform(CustomEvent e){}
};
CustomEvent cEvent;
Handler* handler = new CustomHandler;
//this calls Handler::inform(Event), not CustomHandler::(CustomEvent) , as I expected
handler->inform(cEvent);
如果我的代码改成这样:
class Handler
{
public:
virtual void inform(Event e){}
virtual void inform(CustomEvent e){}
};
class CustomHandler : public Handler
{
public:
void inform(CustomEvent e){}
};
CustomEvent cEvent;
Handler* handler = new CustomHandler;
//this calls CustomHandler::(CustomEvent)
handler->inform(cEvent);
我读了这个与功能重载连接和隐藏,但仍然没有按”了解此代码中的行为。
函数重载不工作基础上,运行类型的参数(这对于你的论点在这里是CustomHandler*
),而是对他们的静态类型(这里是Handler*
,因为这就是handler
被声明为) 。
虚函数允许您根据运行时类型一个对象(您称之为函数的对象)进行函数调用。根据多个对象的运行时类型调度调用称为多次调度;在这种情况下,我们正在谈论double dispatch最常见的情况。如果你想要这种功能,你将不得不实现双重调度或使用一个库来为你做。
Visitor pattern是一个很常见的执行方式;另见Difference betwen Visitor pattern & Double Dispatch。
最后,您可以找到访问者的一个很好的讨论,其中包括示例代码(向下滚动)here。
+1你写了我想要回答的内容。除了我计划包括一个具体的访客模式示例。请添加 – 2012-04-03 10:19:39
@ Cheersandhth.-Alf:添加一个链接,它应该可以。我不想添加内联示例(太多的样板)。 – Jon 2012-04-03 10:28:19
许多事情都是错误的代码。对于初学者来说,函数参数应该是* references *。 – 2012-04-03 10:12:58
为什么要引用? – user152508 2012-04-03 10:20:29
由于(a)切片和(b)不必要的副本。 – ipc 2012-04-03 10:22:39