C++学习笔记5---虚函数的工作原理

news/2024/6/29 12:02:16 标签: 工作, c++, 编译器, 存储

ps:编译器对虚方法使用动态联编,运行时根据对象决定调用父类还是子类的这个方法。

 

虚函数的工作原理是:基类的对象维护一个虚函数表,所谓的维护,方式是用一个隐藏指针指向虚函数表。这个虚函数表中记录基类中定义的虚函数的函数地址。同样,派生类的对象也维护这样一个虚函数表。不同的是,1)如果派生类并没有重新实现基类的虚方法,则它的虚函数表记录的该函数地址还是维持基类中的不变;2)如果重新实现了,则记录新的函数地址。3)如果派生类还定义了自己的虚函数,则也要加到虚函数表里来。

      调用虚函数时候,程序查看虚函数表的地址,然后寻找相应的函数。

所以,使用虚函数有一下成本:

1。会使得对象增大,因为要消耗存储地址的空间。

2。编译器要为每个类都创建虚函数地址表。

3。在表中查找地址需要额外操作。

非虚函数虽然效率高,但不具有动态联编的功能。

 

使用虚函数要注意:

1。构造函数不能是虚函数

2。析构函数应该是虚函数

3。友元函数不能是虚函数

网友的阐述: 指针的类型是可以强行转来转去的。普通情况你转什么类型就调对应类型的同名函数。但是虚函数实现多态后,尽管可能你把指针转成父类的类型,但是因为创建的时候是子类的类型,它还是会调用子类的这个虚函数。 这样可以统一代码且正确运用子类的新特性。 也因为如此,如果父类虚函数不做实现而=0成为纯虚函数,那么父类就不可以实例化,这个没有实现的虚函数也永远不会调用。因为根据多态的动态联编,总是会调用实例化了的子类的该方法。指针强行转成父类也不会调用纯虚函数。

http://www.niftyadmin.cn/n/1187036.html

相关文章

算法:最长公共子序列

1。最长公共子序列是求出两个字符串的公共序列,不要求连续,千万不要跟公共字串的概念弄混了。 2。算法中有一个用于存储公共子序列长度的数组,关于这个数组是如何计数的,我还没看懂,但是我调试运行了下,比…

算法:KMP算法实现的模式匹配

所谓的模式匹配就是给定两个字符串:一个是主串,一个是匹配串,要判断后者是不是前者的一个子串或者求出在母串中出现的次数或者位置。必须连续。也就是说,判断,主串中是不是包含匹配串。比如:abcdfrdsadf和d…

python 坑1

1.编码解码 编码:将文字转换成字节形式 encode name 小冯 print(name.encode(utf-8)) # b\xe5\xb0\x8f\xe5\x86\xaf 解码:将字节转换成文字形式 decode name 小冯 msg name.encode(utf-8) print(msg.decode()) # 小冯 2.基础数据类型补充: 2.1 str: 首字母大写 name xiao,f…

散列函数

1。散列函数的选取原则是:运算尽可能简单;函数的值域必须在散列表的范围内;尽可能使得结点均匀分布,也就是尽量让不同的关键码具有不同的散列函数值。需要考虑各种因素:关键码长度、散列表大小、关键码分布情况、记录的…

【转】struts2的ActionInvocation分析(action调度者)

一个ActionInvocation实例代表一个action的执行状态,持有拦截器和将要执行的action的实例。 defaultActionInvocation是其默认实现。下面是定义在该类中的部分成员变量 1 public class DefaultActionInvocation implements ActionInvocation { 2 protected Obje…

关于数据结构中的树--这个我总是学总是忘的东西

由二叉树的前序和中序遍历结果可以推出整个二叉树的结构;进而可以得到后序遍历的结果。类似的,由后序,中序可以推出二叉树结构。唯独由前序,后序不能推出中序。为什么呢?我想了下,原因很显然,前…

十、VueJs 填坑日记之在项目中使用Amaze UI

上一篇博文,我们把jQuery集成到了项目中,今天我们来集成Amaze ui(妹子UI)。先来介绍一下妹子UI。Amaze UI 含近 20 个 CSS 组件、20 余 JS 组件,更有多个包含不同主题的 Web 组件,可快速构建界面出色、体验…

关于排序的总结---这个总是考总是忘的东西

排序方法分类:内排序,外排序。按照方法分为:1)插入排序:包括直接插入排序和希尔排序;2)选择排序:直接选择排序和堆排序;3)交换排序:冒泡排序和快速…