问题标签 [dynamic-binding]

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.

0 投票
5 回答
3134 浏览

c++ - 何时将 C++ 中的函数标记为虚拟函数?

由于方法的静态绑定的 C++ 特性,这会影响多态调用。

来自维基百科:

尽管这种分派机制涉及的开销很低,但对于该语言旨在针对的某些应用程序领域来说,它可能仍然很重要。出于这个原因,C++ 的设计者 Bjarne Stroustrup 选择将动态调度设为可选且非默认。只有使用 virtual 关键字声明的函数才会根据对象的运行时类型进行调度;其他函数将根据对象的静态类型进行调度。

所以代码:

如果这area()是Child 类中的non-virtualParent 类中的函数,overridden则上面的代码将调用Parent's class method开发人员可能不期望的函数。(感谢我介绍的静态绑定)

那么,如果我想编写一个供其他人使用的类(例如库),我是否应该让我的所有函数都是虚拟的,以便前面的代码能够按预期运行?

0 投票
4 回答
205 浏览

c++ - 使用虚函数的力量

考虑以下示例代码:

运行的输出是:

问题:

  1. 在该行Base* bp = &d2中,对象类型在编译时是已知的。那么在这种情况下使用哪个函数bp->vf();也可以在编译时做出决定对吗?

  2. 由于对象类型在编译时本身是已知的,那么这个示例程序中是否使用了虚函数的强大功能?

0 投票
0 回答
17168 浏览

c++ - 根据研究解释为什么构造函数不能是虚拟的:如果有错误,请更正错误

我做了一些研究来找出为什么构造函数不能是虚拟的。我在这里巩固我的理解。

我将首先解释什么是虚函数,然后根据第一个解释解释为什么构造函数不能是虚函数。

什么是virtual function?

虚函数是基类中的函数或方法,可以在派生类中由具有相同签名的函数重新定义或覆盖。换句话说,虚函数允许在派生类中自定义基类方法的实现。它需要用virtual关键字声明。在虚函数调用时,根据调用对象的类型(动态绑定),在运行时决定选择哪个版本的函数定义(在基类或派生类中)。

当一个函数被声明为虚函数时,它告诉编译器调用虚函数的对象的类型应该只在运行时确定。然后根据对象的类型,将函数调用绑定到函数定义,并调用适当的函数。

为什么 aconstructor不能是虚拟的?

当一个函数被声明为虚函数时,它告诉编译器调用该函数的对象的类型应该只在运行时确定,然后根据对象的类型调用适当版本的函数。

如果构造函数被声明为虚拟的,它会告诉编译器调用构造函数的对象类型应该在运行时确定。但是对于构造一个对象,应该在编译时而不是在运行时知道对象的确切类型。这就是构造函数不能是虚拟的原因。

我希望 SO 成员纠正两个答案中的错误(如果有)。如果您可以通过将其重写为您的答案来纠正答案,而不仅仅是指出错误,我认为这将对我和其他人有所帮助。

0 投票
1 回答
462 浏览

c# - 如何对使用转换器的元素进行动态绑定?

我正在使用客户端对象模型开发 Silverlight Web 部件。我的项目中有一个转换器,如下所示

我正在使用此转换器对以下元素进行绑定

我在 TimeLog 类中定义了一个属性,如下所示

绑定对我来说工作正常。现在我有一个 datagrid 的 loadingrow 事件,如下所示。

摘要DataGrid_LoadingRow

请参阅上面代码中的以下行

在上面的行中,我想为特定行索引动态绑定 textblok 的 Foreground 属性。在这种情况下,我希望转换器将值作为(为特定行索引返回以下值)

我不知道该怎么做。您能为我提供上述问题的任何代码或链接吗?如果我做错了什么,请指导我。

0 投票
4 回答
937 浏览

c++ - 从构造函数调用虚函数和纯虚函数

当我从基本构造函数调用虚函数时,编译器不会给出任何错误。但是当我从基类构造函数调用纯虚拟函数时,它会产生编译错误。

考虑下面的示例程序:

这里可以看出纯虚函数是有定义的。我希望在bptr->virtualfunc()执行时调用基类中定义的纯虚函数。相反,它给出了编译错误:

错误:从构造函数调用抽象虚拟`virtual void base::virtualfunc()'

这是什么原因?

0 投票
6 回答
443 浏览

c++ - O'Reilly 的“Objective-C Pocket Reference”声称 C++ 不支持动态调度,这是真的吗?

在第 4 页上,它说:

Objective-C 动态决定——在运行时——通过搜索接收者的类和父类来处理消息的代码。(Objective-C 运行时缓存搜索结果以获得更好的性能。)相比之下,C++ 编译器在编译时静态构造调度表。

我在 StackOverflow 和 Wikipedia 上阅读了很多内容,足以说明我对 C++ 是否支持 Dynamic Dispatch(有人说是动态绑定的实现)完全感到困惑。

任何人都能够弄清楚动态调度、动态绑定以及 C++ 是否支持其中之一或两者之间的区别?我不是 C++ 或 Objective-C 专家,我来自 Java、Python 和 PHP 世界。

0 投票
3 回答
664 浏览

c++ - 将 C++ 模板与动态绑定类一起使用

过去我在 C++ 中使用过模板和动态绑定,但最近我尝试将它们一起使用,发现无法编译。

我想做的是这样的:

MyClass 恰好是一个利用动态内存绑定的类。经过几个小时的搜索,我的印象是这会导致我仍然无法解决的问题,因此我希望就该问题以及如何解决该问题提供一些指导。

我的最终目标是能够做这样的事情:

我尝试过以各种方式使用指针,但它不起作用,我看不到可以做什么。

我收到以下错误:

0 投票
2 回答
295 浏览

c++ - 非重写虚函数的绑定类型

考虑virtual function基类not overriden中的 a 在派生类中的情况。然后使用一个base class pointer to a derived class object虚函数被调用。

我知道函数调用将在编译时解析为基类中的函数。

问题

由于函数在派生类中没有被覆盖,函数调用会在编译时绑定到函数实现,还是会延迟绑定直到运行时?

0 投票
3 回答
1191 浏览

c++ - 指向基类子对象的指针。调用了哪个版本的虚函数?

dynamic binding中,函数调用根据指针指向的对象类型绑定到函数实现。

假设我们有以下代码:

让函数func在基类中声明为虚拟的。func然后,由于动态绑定,派生类的虚函数版本将在运行时被调用。

我理解上面的概念。

但是我在研究了上述概念后对以下概念感到困惑。

在上面的代码片段中,指向派生类对象的指针被隐式转换为指向基类对象的指针。那么bptr将实际指向派生类对象的基类子对象,而不是指向派生类对象。

由于基类指针bptr指向基类子对象,在运行时不应该func调用基类的虚函数版本吗?

0 投票
1 回答
394 浏览

objective-c - 仍然对 Objective-C 的动态绑定感到困惑

这个问题来自我刚刚添加到这个问题的答案的评论,但它不应该是重复的。

@Bavarious 对这个问题的回答对我来说很有意义,但我仍然很困惑,为什么即使对象是 id,运行时也无法将方法绑定到正确的对象?据我了解,dynamic binding还是dynamic typing编译器无法知道 id 背后的对象是什么,但运行时应该知道这一点并选择正确的对象作为消息的接收者。但为什么运行时不能这样做?