gpt4 book ai didi

c++ - 什么是单次 dispatch 和双重 dispatch ?

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

我已经写了访问者模式如下,但我不明白什么是单次和双次分派(dispatch)。AFAIK,单分派(dispatch)是根据调用者类型调用方法,而双分派(dispatch)是根据调用者类型和参数类型调用方法。

我猜双重调度发生在单个类层次结构中,但为什么访问者类具有两个类层次结构但它仍然被视为双重调度。

void floppyDisk::accept(equipmentVisitor* visitor)
{
visitor->visitFloppyDisk(this);
}

void processor::accept(equipmentVisitor* visitor)
{
visitor->visitProcessor(this);
}

void computer::accept(equipmentVisitor* visitor)
{
BOOST_FOREACH(equipment* anEquip, cont)
{
anEquip->accept(visitor);
}

visitor->visitComputer(this);
}

void visitFloppyDisk(floppyDisk* );
void visitProcessor(processor* );
void visitComputer(computer* );

请使用我提供的示例代码进行解释。

AFAIK,第一次分派(dispatch)发生在调用 accept 的对象上,第二次分派(dispatch)发生在调用 visit 方法的对象上。

谢谢。

最佳答案

简而言之,单分派(dispatch)是指一个方法在一个参数的类型上是多态的(包括隐式的this)。双重分派(dispatch)是两个参数的多态性。

第一个的典型示例是标准虚方法,它在包含对象的类型上是多态的。第二种可以通过访问者模式实现。

[update] 我假设在您的示例中,floppyDiskprocessorcomputer 均继承自将 accept 定义为虚方法的通用基类。类似地,visit* 方法应该在 equipmentVisitor 中声明为虚拟方法,它应该有一些具有不同 visit* 实现的派生类。 [/update]

假设以上,acceptthisequipmentVisitor 上都是多态的。软盘、处理器和计算机都有自己的accept实现,所以当访问者调用accept时,cal会根据被调用者的类型进行调度。然后被调用者回调访问者类型特定的访问方法,并根据访问者的实际类型调度此调用。

理论上也可以有三重、四重等分派(dispatch),尽管我从未在实践中看到过这种实现(在本质上不支持双重和更高分派(dispatch)的语言中,也就是说——我似乎记得 Smalltalk 支持?)。在 C++ 和类似语言中使用 Visitor 进行双重分派(dispatch)本身就已经相当令人难以置信,因此三重和更高分派(dispatch)的实现简直太复杂了,无法在实际应用中使用。

关于c++ - 什么是单次 dispatch 和双重 dispatch ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3262811/

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