gpt4 book ai didi

c++ - 动态、静态和后期绑定(bind)有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:43 24 4
gpt4 key购买 nike

我正在浏览 Object-Oriented Programming in Objective-C Apple 指导。在 Dynamism-->Dynamic Binding 这个主题下,有三个概念:

  1. 动态绑定(bind)
  2. 后期绑定(bind)
  3. 静态绑定(bind)

我几乎理解了动态绑定(bind)和后期绑定(bind)之间的区别,但是静态绑定(bind)却让人很困惑。有人可以用 Objective-C 或 C++ 中的示例解释这三个概念之间的区别吗?

注意:在您考虑将此问题标记为重复之前,SO 上没有同时描述这三件事的问题。

最佳答案

静态绑定(bind):被引用的项目是在编译时确定的。在 (Objective-)C(++) 中,对函数 的调用是静态绑定(bind)的;例如库函数 fabsNSLog。在这些语言中,对变量的引用也是静态的; 哪个 变量被引用完全在编译时确定。静态绑定(bind)不能在运行时失败,无法确定静态绑定(bind)引用指的是什么是编译时错误。

后期绑定(bind):这是在运行时确定所引用的确切项目的地方。这通常但并非总是发生在语言支持继承/子类型化时,其中类型 T 可能是类型 S 的子类型/子/子类(术语取决于语言)。这意味着类型 T 的值具有所有类型 S 的值的属性,以及在包含方法的面向对象语言中,类型 T 的值可以被视为类型 S 的值。Java 示例:

TextComponent t; // a reference to a value of type TextComponent OR any of
// its subclasses, such as TextArea or TextField
Color c = t.getBackground(); // a call to TextComponent's getBackground method or
// TextArea's getBackground method etc.

调用哪个 getBackground 方法直到运行时才确定,并且取决于t 引用的值的类型。然而,必须有一个getBackground 方法,因为t 只能引用类型为TextComponent 或其类型之一的值亚型。实际上,当编译器编译此片段时,可能不知道 TextComponent 的所有子类型,但这并不重要,因为子类型保证每个子类型都有一个 getBackground 方法。因此,与静态绑定(bind)一样,后期绑定(bind)不会在运行时失败。

动态绑定(bind):这是超越后期绑定(bind)的一步,它留给运行时来确定引用的项是否存在。 Objective-C 中的一个简单示例:

id anyObject; // this can hold a reference to any Objective-C object

NSUInteger len = [anyObject length]; // TRY to call a method length on the object
// referenced by anyObject. If at runtime this is,
// say, an NSString or NSMutableString value it will
// succeed. However if it is, say, an NSNumber value
// it will FAIL

像后期绑定(bind)一样,被调用的实际方法直到运行时才确定;然而,与后期绑定(bind)不同的是,这种方法是否存在也留给了运行时。因此,与静态绑定(bind)和后期绑定(bind)不同,动态绑定(bind)可能会在运行时失败

正如您可能会问的那样:许多语言根本不支持动态绑定(bind),因为可能会出现运行时错误 - 它不适合安全关键软件,但适合快速原型(prototype)制作。然而,它确实允许以其他方式更难完成的设计,因此某些语言可以做到,例如 Objective-C,并且这些语言的用户必须接受能力越大,责任越大。 Xcode/Clang 编译器竭尽全力进行尽可能多的静态类型检查,并且大多数 Objective-C 代码将尽可能精确地使用类型。

关于c++ - 动态、静态和后期绑定(bind)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22427867/

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