问题标签 [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.
c++ - 何时将 C++ 中的函数标记为虚拟函数?
由于方法的静态绑定的 C++ 特性,这会影响多态调用。
来自维基百科:
尽管这种分派机制涉及的开销很低,但对于该语言旨在针对的某些应用程序领域来说,它可能仍然很重要。出于这个原因,C++ 的设计者 Bjarne Stroustrup 选择将动态调度设为可选且非默认。只有使用 virtual 关键字声明的函数才会根据对象的运行时类型进行调度;其他函数将根据对象的静态类型进行调度。
所以代码:
如果这area()
是Child 类中的non-virtual
Parent 类中的函数,overridden
则上面的代码将调用Parent's class method
开发人员可能不期望的函数。(感谢我介绍的静态绑定)
那么,如果我想编写一个供其他人使用的类(例如库),我是否应该让我的所有函数都是虚拟的,以便前面的代码能够按预期运行?
c++ - 使用虚函数的力量
考虑以下示例代码:
运行的输出是:
问题:
在该行
Base* bp = &d2
中,对象类型在编译时是已知的。那么在这种情况下使用哪个函数bp->vf();
也可以在编译时做出决定对吗?由于对象类型在编译时本身是已知的,那么这个示例程序中是否使用了虚函数的强大功能?
c++ - 根据研究解释为什么构造函数不能是虚拟的:如果有错误,请更正错误
我做了一些研究来找出为什么构造函数不能是虚拟的。我在这里巩固我的理解。
我将首先解释什么是虚函数,然后根据第一个解释解释为什么构造函数不能是虚函数。
什么是virtual function
?
虚函数是基类中的函数或方法,可以在派生类中由具有相同签名的函数重新定义或覆盖。换句话说,虚函数允许在派生类中自定义基类方法的实现。它需要用
virtual
关键字声明。在虚函数调用时,根据调用对象的类型(动态绑定),在运行时决定选择哪个版本的函数定义(在基类或派生类中)。当一个函数被声明为虚函数时,它告诉编译器调用虚函数的对象的类型应该只在运行时确定。然后根据对象的类型,将函数调用绑定到函数定义,并调用适当的函数。
为什么 aconstructor
不能是虚拟的?
当一个函数被声明为虚函数时,它告诉编译器调用该函数的对象的类型应该只在运行时确定,然后根据对象的类型调用适当版本的函数。
如果构造函数被声明为虚拟的,它会告诉编译器调用构造函数的对象类型应该在运行时确定。但是对于构造一个对象,应该在编译时而不是在运行时知道对象的确切类型。这就是构造函数不能是虚拟的原因。
我希望 SO 成员纠正两个答案中的错误(如果有)。如果您可以通过将其重写为您的答案来纠正答案,而不仅仅是指出错误,我认为这将对我和其他人有所帮助。
c# - 如何对使用转换器的元素进行动态绑定?
我正在使用客户端对象模型开发 Silverlight Web 部件。我的项目中有一个转换器,如下所示
我正在使用此转换器对以下元素进行绑定
我在 TimeLog 类中定义了一个属性,如下所示
绑定对我来说工作正常。现在我有一个 datagrid 的 loadingrow 事件,如下所示。
摘要DataGrid_LoadingRow
请参阅上面代码中的以下行
在上面的行中,我想为特定行索引动态绑定 textblok 的 Foreground 属性。在这种情况下,我希望转换器将值作为(为特定行索引返回以下值)
我不知道该怎么做。您能为我提供上述问题的任何代码或链接吗?如果我做错了什么,请指导我。
c++ - 从构造函数调用虚函数和纯虚函数
当我从基本构造函数调用虚函数时,编译器不会给出任何错误。但是当我从基类构造函数调用纯虚拟函数时,它会产生编译错误。
考虑下面的示例程序:
这里可以看出纯虚函数是有定义的。我希望在bptr->virtualfunc()
执行时调用基类中定义的纯虚函数。相反,它给出了编译错误:
错误:从构造函数调用抽象虚拟`virtual void base::virtualfunc()'
这是什么原因?
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 世界。
c++ - 将 C++ 模板与动态绑定类一起使用
过去我在 C++ 中使用过模板和动态绑定,但最近我尝试将它们一起使用,发现无法编译。
我想做的是这样的:
MyClass 恰好是一个利用动态内存绑定的类。经过几个小时的搜索,我的印象是这会导致我仍然无法解决的问题,因此我希望就该问题以及如何解决该问题提供一些指导。
我的最终目标是能够做这样的事情:
我尝试过以各种方式使用指针,但它不起作用,我看不到可以做什么。
我收到以下错误:
c++ - 非重写虚函数的绑定类型
考虑
virtual function
基类not overriden
中的 a 在派生类中的情况。然后使用一个base class pointer to a derived class object
虚函数被调用。
我知道函数调用将在编译时解析为基类中的函数。
问题
由于函数在派生类中没有被覆盖,函数调用会在编译时绑定到函数实现,还是会延迟绑定直到运行时?
c++ - 指向基类子对象的指针。调用了哪个版本的虚函数?
在dynamic binding
中,函数调用根据指针指向的对象类型绑定到函数实现。
假设我们有以下代码:
让函数func
在基类中声明为虚拟的。func
然后,由于动态绑定,派生类的虚函数版本将在运行时被调用。
我理解上面的概念。
但是我在研究了上述概念后对以下概念感到困惑。
在上面的代码片段中,指向派生类对象的指针被隐式转换为指向基类对象的指针。那么bptr
将实际指向派生类对象的基类子对象,而不是指向派生类对象。
由于基类指针bptr
指向基类子对象,在运行时不应该func
调用基类的虚函数版本吗?
objective-c - 仍然对 Objective-C 的动态绑定感到困惑
这个问题来自我刚刚添加到这个问题的答案的评论,但它不应该是重复的。
@Bavarious 对这个问题的回答对我来说很有意义,但我仍然很困惑,为什么即使对象是 id,运行时也无法将方法绑定到正确的对象?据我了解,dynamic binding
还是dynamic typing
编译器无法知道 id 背后的对象是什么,但运行时应该知道这一点并选择正确的对象作为消息的接收者。但为什么运行时不能这样做?