虚函数覆盖和隐藏

时间:2012-04-03 10:08:48

标签: c++ override

我有这段代码:

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

我读到这与函数覆盖和隐藏有关,但仍然不理解此代码中的行为。

1 个答案:

答案 0 :(得分:9)

函数重载不能基于参数的运行时类型(这里的参数为CustomHandler*),而是基于 static 类型(这里是Handler*,因为handler被声明为。)

虚函数允许您根据一个对象(您调用该函数的对象)的运行时类型进行函数调用。基于多个对象的运行时类型调度调用称为多个调度;在这种情况下,我们谈论double dispatch最常见的情况。如果您需要这种功能,则必须实现双重调度或使用为您执行此操作的库。

Visitor pattern是一种非常常见的实施方式;另见Difference betwen Visitor pattern & Double Dispatch

最后,你可以找到一个关于访客的好讨论,其中包括示例代码(向下滚动)here