c++动态绑定的技术实现
1 什么是动态绑定
有一个基类,两个派生类,基类有一个virtual函数,两个派生类都覆盖了这个虚函数。现在有一个基类的指针或者引用,当该基类指针或者引用指向不同的派生类对象时,调用该虚函数,那么最终调用的是该被指向对象对应的派生类自己实现的虚函数。
2 为何能够在运行时找到派生类自己实现的虚函数呢?
2.1 肯定不是编译期指定好了的
因为可以在运行时,动态的改变该基类指针指向的对象。也就是说,该基类指针指向的地址是可以变化的。可见,是对象内部保存了关于自己和父类的虚函数的线索。因为基类每次都是指向对象本身的,它通过对象本身找到了对应的虚函数。
2.2 对象和类的数据结构的支持
虚函数是类的成员,是所有的对象所共有的,因此要特殊保存虚函数也应该是类的事情,而不是对象的事情,对象只要能够找到它们就可以了。
是这样设计的,编译起会为每个有虚函数的类都创建一个虚函数表,里面记录着每个虚函数。另外,每个对象有一个隐含指针指向它对应的类的虚函数表。
这样,在运行时,动态绑定的调用过程是这样的,首先,基类指针被赋值为派生类对象的地址,那么就可以找到指向这个类的虚函数的隐含指针,然后通过该虚函数的名字就可以在这个虚函数表中找到对应的虚函数的地址。然后进行调用就可以了。
由于继承层次中每个类都有自己的虚函数表,因此各自完成自己的动态绑定,互不影响。
转载于:https://www.cnblogs.com/hustdc/p/6485913.html
c++动态绑定的技术实现相关推荐
- c++ gdb 绑定源码_第18篇:C++ 静态绑定和动态绑定
编译程序时,C ++编译器对源代码中的每个语句转换为一行或多行机器语言. 我们从之前的汇编基础系列和内存管理文章中,已经知道每行机器语言都有其自己的唯一的顺序地址. 由于函数也是一个数据对象,它也将转 ...
- 【C++ Primer | 15】虚函数表剖析(一)
一.虚函数 1. 概念 多态指当不同的对象收到相同的消息时,产生不同的动作 编译时多态(静态绑定),函数重载,运算符重载,模板. 运行时多态(动态绑定),虚函数机制. 为了实现C++的多态,C++使用 ...
- C/C++后台开发基础知识
C和C++语言基础 参考书籍:<C++ primer>,<effective C++>,<STL源码解析>,<深度搜索C++对象模型> extern关键 ...
- 关于C++中的一些特殊函数inline,virtual等等
文章目录 inline内联函数 虚函数 virtual 虚函数 virtual 纯虚函数和抽象类 c++ 中的struct explicit (显式) friend 友元函数与友元类 enum枚举 t ...
- C++问题汇总(一)
1.TCP/IP close_wait状态和time_wait状态. TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭. CLOSE_WAIT状态的生成原因 首先我们知道,如果我们 ...
- C++面试基础知识点
C++开发面试基础知识点 1. 语言基础 1.1 const的用法 1)在定义的时候必须进行初始化 2)指针可以是const 指针,也可以是指向const对象的指针 3)定义为const的形参,即在 ...
- 收集的计算机编程电子书目录,仅供日后查阅方便
本人有收集电子书的癖好.每日在网上收集经典的电子书籍,尤其喜欢原版的,看起来舒服.不过总是心血来潮,当时下载后瞅几眼,之后就束之高阁,再也不问津了.很为此苦恼,过后找某本书时也总是不知道在哪,为了查找 ...
- Java实现lucene搜索功能
直接上代码: package com.sand.mpa.sousuo;//--------------------- Change Logs---------------------- //<p ...
- 提高C++性能的编程技术笔记:总结
<提高C++性能的编程技术>这本书是2011年出版的,书中有些内容的介绍可能已经过时,已不再适用于现在的C++编程中,但大部分内容还是很有参考意义的. 这里是基于之前所有笔记的简单总结,笔 ...
最新文章
- 专访《Javascript设计模式与开发实践》作者曾探:爱编程 爱生活
- 【STM32】 Keil介绍、下载、安装与注册
- linux中Tomcat 8 文件上传后无访问权限
- SQL 给字符串补0
- 【APIO2016】Fireworks【闵可夫斯基和】【凸包向量和】【可并堆】
- layui 单独使用日期组件
- LeetCode 2057. 值相等的最小索引
- 云原生应用架构转型不好做?阿里云这个平台让你一步到位!
- Qt简单的解析Json数据例子(一)
- 【生活】我的2019年度总结
- Sketch 52.2 macOS 破解版 汉化插件
- 七牛的管理接口不支持js端发送请求进行管理(设计到跨域问题)
- HSL、RGB颜色转换
- lt;#37;= %、lt;#37; %、lt;#37;@ %、lt;#37;:%和lt;#37;# %的区别
- 对数组名取地址赋值给数组指针与普通指针的区别
- 软件测试可以做到多大岁数?
- RESTful API接口设计标准及规范;
- Effective C++ 规则39:明智而谨慎的使用private继承
- 解决vbe6ext.olb不能被加载 问题
- 《hadoop进阶》web日志系统 KPI指标的分析与实现
热门文章
- 算法(5)-leetcode-explore-learn-数据结构-字符串
- linux6.0 安装教程,CentOS 6.0安装步骤
- 为什么人会摆高姿态_Yo , 你为什么喜欢冲浪?
- 英语口语Week16 Wednesday
- android--在命令行中生成Android的数字证书keystore文件
- 想对你说的话,就在这里!
- Android设计模式之——观察者模式
- 做老板欣赏的优秀员工 十大准则你达标吗?
- postman 无法正常返回结果 Could not get any response
- 记录一个相当好用的反编译工具下载地址