覆盖和隐藏虚拟功能

覆盖和隐藏虚拟功能

问题描述:

我有这样的代码:覆盖和隐藏虚拟功能

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); 

我读了这个与功能重载连接和隐藏,但仍然没有按”了解此代码中的行为。

+3

许多事情都是错误的代码。对于初学者来说,函数参数应该是* references *。 – 2012-04-03 10:12:58

+0

为什么要引用? – user152508 2012-04-03 10:20:29

+2

由于(a)切片和(b)不必要的副本。 – ipc 2012-04-03 10:22:39

函数重载不工作基础上,运行类型的参数(这对于你的论点在这里是CustomHandler*),而是对他们的静态类型(这里是Handler*,因为这就是handler被声明为) 。

虚函数允许您根据运行时类型一个对象(您称之为函数的对象)进行函数调用。根据多个对象的运行时类型调度调用称为多次调度;在这种情况下,我们正在谈论double dispatch最常见的情况。如果你想要这种功能,你将不得不实现双重调度或使用一个库来为你做。

Visitor pattern是一个很常见的执行方式;另见Difference betwen Visitor pattern & Double Dispatch

最后,您可以找到访问者的一个很好的讨论,其中包括示例代码(向下滚动)here

+0

+1你写了我想要回答的内容。除了我计划包括一个具体的访客模式示例。请添加 – 2012-04-03 10:19:39

+0

@ Cheersandhth.-Alf:添加一个链接,它应该可以。我不想添加内联示例(太多的样板)。 – Jon 2012-04-03 10:28:19