1、 概念
首先,什么是绑定?( what`s the definition of binding? )
c++编程思想上有说到:
Connecting a function call to a function body is called binding.(将函数体和函数调用关联起来,就叫绑定)
然后,那么什么是早绑定?(Early binding)
When binding is performed before the program is run (by the compiler and linker), it' s called early binding
在程序运行之前(也就是编译和链接时),执行的绑定是早绑定。
然后,什么是迟绑定?(late binding)
late binding, which means the binding occurs at runtime, based on the type of the object.
When a language implements late binding, there must be some mechanism to determine the
type of the object at runtime and call the appropriate member function
迟绑定发生在运行时,基于不同类型的对象。当一种语言实现迟绑定时,必须有某种机制确定对象的具体类型然后调用合适的成员函数。
2、 结论
2.1对于含有虚拟函数的类来说:
Ø 虚函数表是与类关联的,也就是说,一个类只有一张虚函数表。(从这个方面上说,虚函数类似于类的静态函数)(父类有一个Vtable,子类也有一个Vtable)
Ø VTable中虚函数的位置是由基类决定的,所以,哪怕你在派生类中不是按基类的顺序来重写虚函数,派生类的VTable中虚函数的存放顺序和基类的也是一样的。
Ø 虚函数指针VPtr是与对象关联的,每个对象都有一个虚函数指针,但是,同类的对象的虚函数指针的值是相同的。因为都指向该类的虚函数表。
Ø 虚函数指针VPtr的值是在调用构造函数时进行初始化的(自动完成)。
2.2 C++迟绑定实现机理流程(编译器都是类似于此种方式实现的):
(1)为每个含有虚函数的类(基类以及派生类)都创建一张虚函数表(VTable,存储于常量区),依次存放虚函数的地址。对于派生类来说,如果没有重写其基类的虚函数,那么,将会在VTable中存放基类的虚函数地址。
(2)为每个含有虚函数的类的对象,创建一个指针(VPtr),指向这个类的虚函数表(所以说,同类对象的VPtr的值是一样的[*VPtr相同,但VPtr不同],也就是说,虚函数,在这一点上,类似于类的static函数,是所有对象共有的。)(此过程发生在运行期自动调用构造函数的过程中)
(3)通过强制转换将派生类对象的地址/引用 赋给基类指针/变量(也就是向上类型转换UpCasting)(此步决定了基类指针首先寻址的虚函数表,也就是现在派生类的虚函数表中寻址,如果在派生类的虚函数表中没有找到此虚函数,则向上一级基类的虚函数表中寻找此虚函数,依次类推。由此可见,虽然代码相同,却实现了调用不同类函数的目的,也就是多态)
(4)然后,通过基类指针/引用对象 来调用虚函数(即:polymorphic call),就会通过此时基类对象的VPtr指针在所指向虚函数表中寻址(一般是从表头地址开始,加上一定的偏移量)找到相应的函数地址,也就是之前派生类VPtr指针指向的虚函数表的函数地址。
2.3晚绑定原理
编译器对每个包含虚函数的类创建一个表(称为V TA B L E)。在V TA B L E中,编译器放置特定类的虚函数地址。在每个带有虚函数的类中,编译器秘密地置一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E。通过基类指针做虚函数调用时(也就是做多态调用时),编译器静态地插入取得这个V P T R,并在V TA B L E表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。为每个类设置V TA B L E(编译期)、初始化V P T R(运行期构造函数中)、为虚函数调用插入代码(运行期多态调用时),所有这些都是自动发生的,所以我们不必担心这些。利用虚函数,这个对象的合适的函数就能被调用,哪怕在编译器还不知道这个对象的特定类型的情况下。(《C++编程思想》)
2.4早绑定和晚绑定优缺点
早绑定,晚绑定,早晚都要绑定。绑定指在对象和其类型间建立关联的过程。
早绑定指在对象申明的时候就和他的类型建立了关联。
晚绑定是指我们的代码在运行时再检查对象是否提供了我们所需要的方法和属性。
很多人说C#和Java是早绑定的,javascript,python是迟绑定的,其实这个说法并不全对
一方面,C#和Java是强类型的,在变量声明的时候就说明了类型,从这里来讲当然是早绑定的,于是我们才能在IDE中享受代码提示带来的方便,因为ide通过你的申明就能知道你的对象是什么类型,具有什么方法和属性,然后提示给你,同时编译的时候也可以帮你检查许多类型转换的错误.
另一方面:无论C#和Java在实现他们很重要的一个功能:多态的时候,都是用晚绑定,比如你的父类中定义了virtual的方法,那么这个方法可能会在你的子类中重载,具体你用什么子类,是变量申明时所不知道的,在C++编译器会在编译的时候为这些类加上一个指针,指针指向一个虚表,虚表中存在着真实的函数,这个是就是一个晚绑定了
早绑定的优点是:
Ø 编译效率
Ø 代码提示(代码智能感知)
Ø 编译时类型检查
晚绑定的优点是:
Ø 不用申明类型
Ø 对象类型可以随时更改
参考资料:
http://blog.csdn.net/faithmy509/archive/2009/05/21/4207625.aspx
http://www.cnblogs.com/yizhu2000/archive/2007/07/12/815628.html
分享到:
相关推荐
我在论坛上找了几个大漠后台...大家要学会举一反三毕竟这个工具只是提供给我们测试游戏是否支持某种绑定模式。此程序不涉及大漠插件的收费功能,所以没有提供付费用户绑定测试的接口。因为我想大部分用户都是免费用户。
在Java中,非虚方法(final、private和静态方法)以及构造函数都是静态绑定的。例如: ```java class Animal { void sound() { System.out.println("Animal is making a sound"); } } class Dog extends Animal...
1.TextBox绑定后台的值(一次绑定,类似于赋值); 2.TextBox绑定后台的值(可通过改绑定的值自动更新值); 3.TextBox绑定另一个控件的属性值(随时更新值); 4.TextBox绑定另一个控件的属性值(双向更新); 5....
在IBM AIX操作系统中,双网卡绑定是一种提高网络连接可靠性和性能的技术,通常被称为 EtherChannel 或 PortChannel。这种技术允许将多个物理网络接口组合成一个逻辑接口,从而实现负载均衡或提供冗余连接。在描述中...
无论哪种数据绑定方式,都极大地提高了开发效率,减少了手动同步数据的工作量。在实际开发中,开发者应根据项目需求选择合适的数据绑定类型,以实现高效且灵活的数据交互。对于初学者,理解并掌握这两种数据绑定方式...
当我们谈论“C# datagridview 绑定数据后绑定标题”,这意味着我们需要将数据源与`DataGridView`关联,并自定义列头显示。 首先,让我们了解如何绑定数据到`DataGridView`。数据可以来自各种来源,例如数据库、数组...
C# WINFORM 控件双向绑定少为人知的秘密 在 WinForm 开发中,控件双向绑定是一个常见的问题。双向绑定指的是控件的值与数据源的值保持同步,当控件的值发生变化时,数据源的值也会相应地变化,反之亦然。今天,我们...
在Windows Presentation Foundation (WPF) 中,数据绑定是将用户界面(UI)元素与应用程序的数据模型连接起来的关键机制。这使得UI可以动态地反映数据的变化,反之亦然。本示例将详细介绍WPF中的五种数据绑定方式:...
【服务器双网卡绑定】是一种网络技术,常用于提高服务器的网络连接稳定性和带宽,同时也能增强网络的冗余性。在Linux操作系统中,这种技术通常被称为“网卡聚合”或“网络 bonding”。本篇将重点介绍在Windows环境下...
3. **安全配置**:关闭不必要的自动转换功能,例如禁止空值绑定,限制可以绑定的数据类型,以及配置合理的默认值。 4. **参数绑定安全类库**:使用像OWASP Java Encoder这样的库来安全地处理用户输入,防止注入攻击...
综上所述,layui动态绑定事件方法的核心是通过事件委托来处理动态创建的DOM元素,并且要特别注意兼容性问题以及框架组件的实例化。通过上述方法,即使是动态添加到页面上的元素,也能确保事件能够正确地绑定和触发,...
3. **数据上下文(DataContext)**:设置控件的数据上下文可以将整个视图模型暴露为默认的绑定源,这样所有子控件都将此DataContext作为它们的默认源。 4. **双向绑定**:默认情况下,数据绑定是单向的,但可以通过...
`ElementName=lbColor` 指定了绑定的目标控件,`Path=SelectedItem.Content` 定义了我们要从 `lbColor` 控件中获取的路径。 **绑定模式** WPF 数据绑定支持多种模式,包括单向绑定、双向绑定和只读绑定。单向绑定...
在C++编程语言中,动态绑定和静态绑定是两种关键的多态实现方式,它们对于理解和编写高效、灵活的代码至关重要。多态性允许我们通过一个共同的基类接口访问不同派生类的对象,从而提高了代码的重用性和可扩展性。 ...
本话题主要围绕“易语言写绑定电脑”这一主题,探讨如何利用易语言来实现电脑绑定功能。 首先,我们需要理解“绑定电脑”的概念。通常,这里的“绑定”指的是将软件与特定硬件或用户账户关联,以防止非法复制或未经...
如果不使用绑定变量,每次查询都是一个新的查询,这将导致 Oracle 需要分析、解析、安全检查、优化等一系列操作。这些操作将消耗大量的系统资源,降低用户的使用数量,并且会把优化好的其它查询语句从共享池中踢出。...
首先,我们要理解什么是“大漠”。大漠,全称叫做“大漠网络数据抓取系统”,是由国内开发的一款高效、灵活的网页数据采集软件。它能够自动识别网页结构,抓取所需信息,支持多种数据格式输出,广泛应用于市场分析、...
### Dell R730 双网卡绑定工具详解 #### 一、网卡绑定技术概述 网卡绑定(Network ...此外,需要注意的是,在进行网卡绑定之前,要确保所有必要的软件和驱动程序都已正确安装,并根据实际情况选择合适的绑定类型。
这时候我们可以创建一个类,把value和text都封装到这个类,作为list的类型。例如: ```csharp public class Info { public string Id { get; set; } public string Name { get; set; } } private void bindCbox()...
“万能绑定”这一术语指的是该软件具有广泛的适用性,无论文件类型如何,它都能够进行绑定操作。这种技术在软件开发、数据分发以及软件打包等领域中有着广泛的应用。例如,开发者可能需要将应用程序、库文件、配置...