c++动态绑定的技术实现
1 什么是动态绑定
有一个基类,两个派生类,基类有一个virtual函数,两个派生类都覆盖了这个虚函数。现在有一个基类的指针或者引用,当该基类指针或者引用指向不同的派生类对象时,调用该虚函数,那么最终调用的是该被指向对象对应的派生类自己实现的虚函数。
2 为何能够在运行时找到派生类自己实现的虚函数呢?
2.1 肯定不是编译期指定好了的
因为可以在运行时,动态的改变该基类指针指向的对象。也就是说,该基类指针指向的地址是可以变化的。可见,是对象内部保存了关于自己和父类的虚函数的线索。因为基类每次都是指向对象本身的,它通过对象本身找到了对应的虚函数。
2.2 对象和类的数据结构的支持
虚函数是类的成员,是所有的对象所共有的,因此要特殊保存虚函数也应该是类的事情,而不是对象的事情,对象只要能够找到它们就可以了。
是这样设计的,编译起会为每个有虚函数的类都创建一个虚函数表,里面记录着每个虚函数。另外,每个对象有一个隐含指针指向它对应的类的虚函数表。
这样,在运行时,动态绑定的调用过程是这样的,首先,基类指针被赋值为派生类对象的地址,那么就可以找到指向这个类的虚函数的隐含指针,然后通过该虚函数的名字就可以在这个虚函数表中找到对应的虚函数的地址。然后进行调用就可以了。
由于继承层次中每个类都有自己的虚函数表,因此各自完成自己的动态绑定,互不影响。
c++动态绑定的技术实现的更多相关文章
- c++ 虚函数和纯虚函数
在你设计一个基类的时候,如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的.从设计的角度讲,出现在基类中的虚函数是接口,出现在派生类中的虚函数是接口的具体实现.通过这样的方法,就可以将对象 ...
- oc学习笔记2
.oc中的BOOL类型 oc中的BOOL类型的值为YES和NO,有点小奇怪 在oc中YES不等于1,但是NO一定等于0,所以不要把1和YES来比较 .消息发送 在oc中,经常使用这样的术语:将allo ...
- [随笔][Java][something]
import 只能导入包中的类,不能导入某个包.为了方便,一般不导入单独的类,而是导入包下的所有类.import java.util.*; 包java.lang中的所有类默认由编译器全部导入了,不必手 ...
- 【C++ Primer | 15】C++虚函数表剖析①
概述 为了实现C++的多态,C++使用了一种动态绑定的技术.这个技术的核心是虚函数表(下文简称虚表).本文介绍虚函数表是如何实现动态绑定的. C++多态实现的原理: • 当类中声明虚函数时,编译器会 ...
- C++虚函数表剖析
关键词:虚函数.虚表,虚表指针,动态绑定,多态 一.概述 为了实现C++的多态,C++使用了一种动态绑定的技术. 这个技术的核心是虚函数表(下文简称虚表).本文介绍虚函数表是怎样实现动态绑定的. 二. ...
- 页面静态化技术Freemarker技术的介绍及使用实例.
一.FreeMarker简介 1.动态网页和静态网页差异 在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术.静态网页,随着HTML代码的生成,页面的内容和显示效 ...
- 转载--提高C++性能的编程技术
读书笔记:提高C++性能的编程技术 第1章 跟踪范例 1.1 关注点 本章引入的实际问题为:定义一个简单的Trace类,将当前函数名输出到日志文件中.Trace对象会带来一定的开销,因此在默认情况 ...
- C#反射技术概念作用和要点
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
- C#与数据库访问技术总结(十八)
ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...
随机推荐
- Codeforces Round #449 (Div. 2) B. Chtholly's request【偶数位回文数】
B. Chtholly's request time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- svn报“Previous operation has not finished; run 'cleanup' if it was interrupted”的错误
-.叙述 今天需要更新接口文檔,所以就update了一下,結果報了如下錯誤: Error : Previous operation has not finished; run 'cleanu ...
- android dagger2使用笔记
Dependency Injecte(依赖注入) 首先写个不使用依赖注入的示例 interface // House.java public interface House { void prepar ...
- 超实用的Nginx极简教程,覆盖了常用场景
概述 安装与使用 安装 使用 nginx 配置实战 http 反向代理配置 负载均衡配置 网站有多个 webapp 的配置 https 反向代理配置 静态站点配置 搭建文件服务器 跨域解决方案 参考 ...
- springboot 2.0.8 跳转jsp页面
springboot项目创建教程 https://blog.csdn.net/q18771811872/article/details/88126835 springboot 2.0跳转 html教程 ...
- Linux下Shell文件内容替换(sed)(转)
sed -i 's/被替换的内容/要替换成的内容/g' file #-i为直接修改并保存 参考: http://blog.sina.com.cn/s/blog_7211cb9201019hgd.htm ...
- CMake的应用(在vision studio2008中去掉 ALL_BUILD 和 ZERO_CHECK)
from http://blog.csdn.net/jtop0/article/details/6167432 一般由CMake是 跨平台软件开发和维护过程的 工程构建工具.“在每个系统构建你的工程 ...
- webservice测试窗体只能用于来自本地计算机的请求
写在前面 在编写好webservice后,发布到iis服务器,你会发现会有这样的异常“测试窗体只能用于来自本地计算机的请求”. 解决方案 在web.config中添加以下代码即可解决问题 <we ...
- Windows2003建立FTP服务器以及报530 User <用户名> cannot log in home directory inaccessible的解决方法
Windows2003建立FTP服务器: Windows2003建立FTP服务器 FTP连接 ...
- ylb:SQL 视图(View)基础
ylbtech-SQL Server: SQL Server-SQL 视图(View)基础 SQL 视图(View)基础. 1,ylb:视图(View)基础返回顶部 -- ============== ...