问题标签 [dynamic-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ada - Ada 封装动态调度操作(原语)背后的基本原理
在 Ada 中,类型 T 的原始操作只能在定义了 T 的包中定义。例如,如果一个Vehicules
包定义Car
并Bike
标记了记录,它们都继承了一个通用的Vehicle
抽象标记类型,那么所有可以在类范围Vehicle'Class
类型上调度的操作都必须在这个Vehicles
包中定义。
假设您不想添加原始操作:您没有编辑源文件的权限,或者您不想用不相关的功能使包混乱。
然后,您不能在其他包中定义隐式调度 type的操作Vehicle'Class
。例如,您可能想要序列化车辆(定义Vehicles_XML
带有To_Xml
调度功能的包)或将它们显示为 UI 元素(使用, , ... 调度功能定义Vehicles_GTK
包)等。执行动态调度的唯一方法是编写代码明确;例如,里面:Get_Label
Get_Icon
Vechicle_XML
(当然,在其他地方定义和使用的访问者模式Vehicles
也可以工作,但这仍然需要相同类型的显式调度代码。实际上编辑,不,但仍然需要编写一些样板代码)
我的问题是:
为什么在 T 上动态调度的操作仅限于在 T 的定义包中定义?
这是故意的吗?这背后有什么历史原因吗?
谢谢
编辑:
感谢当前的答案:基本上,这似乎是语言实现的问题(冻结规则/虚拟表)。
我同意编译器是随着时间的推移逐渐开发的,并且并非所有功能都很好地适合现有工具。因此,将调度运算符隔离在一个独特的包中似乎是一个主要受现有实现指导而不是语言设计的决定。C++/Java 家族之外的其他语言在没有这种要求的情况下提供动态调度(例如 OCaml、Lisp (CLOS);如果这很重要,它们也是编译语言,或者更准确地说,是存在编译器的语言)。
当我问这个问题时,我想知道在语言规范级别,这部分 Ada 规范背后是否有更根本的原因(否则,这是否真的意味着规范假设/强制执行动态调度的特定实现?)
理想情况下,我正在寻找权威来源,例如参考手册中的基本原理或指南部分,或有关该语言特定部分的任何类型的存档讨论。
c++ - 如何在 Visual Studio 中调试错误的调用堆栈
我正在处理来自 3rd-Pary 库的一个庞大的类,这里是相关内容的摘录:
我的应用程序因内存访问冲突而中断。调用堆栈中最上面的一项是 的实现中的代码行Set_0xB0_0x23_IsoTableData
,第二项是这样的代码行:
在调试视图中,ucData
有 value 0x00000002
,所以它看起来不像调用 的实现SetTableSize
,这应该根据代码发生,而是Set_0xB0_0x23_IsoTableData
使用指定的参数调用 - 这显然会导致错误,因为指针无效。
我已经花了很多时间弄清楚这里发生了什么。我在 Linux 上使用 GCC 在不同的应用程序中编译相同的代码,它在那里工作。这是 Visual Studio 编译器错误吗?编译此代码时,我没有收到任何警告。
不可能构建一个最小的工作示例来重现该错误 - 至少在我弄清楚发生这种情况的原因之前是不可能的。标SomeClass
头中确实有很多#ifdef
s,所以我首先想到的是编译包含的模块时的预处理器定义与SomeClass
编译调用代码时的不同。但是,我仔细检查了,定义是一样的。
所以我想问的基本上是:
- 在什么情况下调用一个虚方法可以调用另一个虚方法的实现?(这与继承无关——这两个方法在同一个类中定义,甚至不共享它们的签名并且具有不同的可见性)
- 如何调试这样的错误?是否可以在 Visual Studio 中查看类实例的调度向量?
virtual-functions - Swift 有动态调度和虚方法吗?
来自 C++/Java/C# 背景,我期待在 Swift 中看到虚拟方法,但是阅读 swift 文档我没有看到虚拟方法的提及。
我错过了什么?
由于浏览量大,我决定奖励最新且非常清晰/详细的答案。
java - 方法的动态调度和访问级别
考虑以下类:
这段代码的输出是A.bar()
然后B.foo()
。我注意到如果我将方法 foo() 的访问级别从public
更改private
为输出是:A.bar()
然后A.foo()
.
为什么?
c++ - 动态调度方法
讨论
我知道我所知道的所有实现(即 C++ 编译器)都通过使用虚拟调度表和虚拟表指针(即已知的and )来实现动态调度机制。vtable
vptr
然而,在询问 C++ 标准时,我发现 C++ 标准并没有明确规定必须如何实现动态调度。这意味着供应商可以使用替代方法进行动态调度,前提是其行为符合 C++ 标准对动态调度行为的要求。
问题
Q1。
vtable
除了s 和s 之外,还有其他有效的方法vptr
可以实现动态调度吗?Q2。如果Q1为真:是什么原因(如果有的话)使实现者决定使用
vtable
s 和vptr
s 来实现动态调度而不是其他一些有效的方法?
c++ - 为什么虚拟函数表指针 (vfptr) 在 C++ 中不能是静态的?
如果该类的所有对象的虚函数表都相同,那么为什么指向该表(vfptr)的指针不能是静态的并且不能在所有对象之间共享?
java - Multiple @ServiceActivator methods with an implicit payload-type-routing
Is there an elegant way to define a single @MessageEndpoint
bean with multiple @ServiceActivator
methods (or something like that), where the methods' argument types are implicitly used as a payload-type-filter?
The idea is to have a single service endpoint which can handle different payload types slightly different without much effort by dispatching on the argument type, which alleviates the implementation of additional service methods down the line.
I'm aware of Google Guava's EventBus
, which dispatches event objects to any registered @Subscribe
method with a matching argument type. I'm currently using this approach, but I was wondering if this was also (kinda) possible with Spring Integration.
c++ - 究竟为什么编译器直到运行时才能确定变量的真实类型?
我经常听说编译器在某些条件下无法确定要使用的方法的确切实现。Fox 的例子,我们可以想象一个场景(人们说),对于一个父类的方法 foo() 已经在子类中被覆盖,编译器现在不会调用 foo() 的哪个实现,直到运行时。因此,我们有了动态调度、vtables 等的概念。
我的问题是,究竟为什么编译器不能确定要调用的确切实现?我最近停下来思考它,我一直在努力证明它的合理性。也许我错过了一些非常明显的东西(当我听到答案时,我可能会踢自己)。仅仅是因为外部环境吗?如果是这样,那将如何发挥作用?
这是语言相关的限制还是手头有更基本的东西?
c++ - 协变返回类型和类型转换
s->duplicate()
返回一个类型的对象Box*
,但我在初始化它时遇到错误Box*
。看起来它正在被转换回Shape*
. 如果将协变返回类型转换回基类指针,那么它有什么意义?:
错误:
c# - 动态对象:获取子泛型类型并将其提供给另一个方法
我有一个方法,它基本上接收一个dynamic
对象。这是由于动态调度造成的,这里不讨论为什么我有dynamic
输入。
我知道这个dynamic
对象表示 ASpecialClass<T>
编译时 T 未知的类型。有没有办法提取T
类型并将其提供给另一种方法?
喜欢:
这里有两件事:
- 有没有办法提取
T
参数的类型? - 是否可以将其提供给另一种通用的方法?
谢谢