C++ 虚拟函数覆盖和隐藏

C++ 虚拟函数覆盖和隐藏,c++,overriding,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*

我有以下代码:

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的讨论,其中包括示例代码(向下滚动)。

代码中有很多地方都有问题。对于初学者来说,函数参数应该是引用。因为(a)切片和(b)不必要的副本。憎恨者会憎恨。即使有些人不喜欢不必要的引用,这个问题仍然有效。谁有足够的勇气来决定什么副本是不必要的?+1你写了我想要回答的。除了我计划包含一个具体的访问者模式示例。请添加that@Cheersandhth.-阿尔夫:添加了一个链接我不想添加一个内联示例(太多的样板文件)。