gpt4 book ai didi

c++ - 虚函数覆盖和隐藏

转载 作者:可可西里 更新时间:2023-11-01 18:28:40 28 4
gpt4 key购买 nike

我有这段代码:

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 声明的类型)。

虚函数允许您根据一个对象(您调用函数的对象)的运行时类型进行函数调用。根据多个对象的运行时类型来调度调用称为多重调度;在此实例中,我们讨论的是最常见的情况 double dispatch .如果你想要这种功能,你将不得不实现双重分派(dispatch)或使用一个库来为你做这件事。

Visitor pattern是一种很常见的实现方式;另见 Difference betwen Visitor pattern & Double Dispatch .

最后,您可以找到有关 Visitor 的精彩讨论,其中包含示例代码(向下滚动)here .

关于c++ - 虚函数覆盖和隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9991143/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com