虚函数覆盖和隐藏

use*_*508 7 c++ overriding

我有这个代码:

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); 
Run Code Online (Sandbox Code Playgroud)

如果我将代码更改为:

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);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*Jon 9

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

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

访问者模式是做执行一个很常见的方式; 另见访客模式和双重调度之间的差异.

最后,您可以在此处找到包含示例代码(向下滚动)的访客的良好讨论.