虚拟功能覆盖和隐藏
Virtual functions overriding and hiding
我有这个代码:
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的良好讨论,其中包括示例代码(向下滚动)。
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 我可以重新分配/覆盖std::字符串吗
- 结构和双指针隐藏在其他结构中,多层混淆
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 关于隐藏,覆盖和虚拟表的汇编错误
- 是否可以覆盖(隐藏)非虚拟方法,但仍然从子类显式调用它
- 我想我将名称隐藏与功能覆盖混淆了
- 覆盖虚函数和隐藏非虚函数有什么区别
- 如果内部类具有与外部类同名的函数,那么它是否在 C++ 和 Java 中隐藏了覆盖或重载
- 虚拟功能覆盖和隐藏
- 立方体面被隐藏表面覆盖
- 多态性和数据隐藏:基类是覆盖还是忽略派生类的访问限制?
- 使用非虚拟覆盖隐藏虚拟函数