虚拟功能覆盖和隐藏

Virtual functions overriding and hiding

本文关键字:隐藏 覆盖 功能 虚拟      更新时间:2023-10-16

我有这个代码:

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就是这样声明的)。

虚拟函数允许您根据一个对象(调用函数的对象)的运行时类型进行函数调用。基于多个对象的运行时类型调度调用称为多重调度;在这个例子中,我们讨论的是最常见的双重调度情况。如果你想要这种功能,你必须实现双重调度,或者使用一个为你做这件事的库。

Visitor模式是一种非常常见的实现方式;另请参阅访客模式之间的差异&双重调度。

最后,您可以在这里找到一个关于Visitor的良好讨论,其中包括示例代码(向下滚动)。