多态类中的虚函数表是Compile-Time,还是Run-Time时发生的

2024-02-28 03:38

本文主要是介绍多态类中的虚函数表是Compile-Time,还是Run-Time时发生的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

备注       sizeof这个函数也是编译时决定的,可以当常量用。

然而这一道很经典的笔试面试测验问题,批复起来也是形形色色,各有各的说法。例如,看到过相仿下面这段话的批复:

虚函数它虚就虚在所谓“迟到联编”可能“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,因而被成为“虚”函数。

看起来有理由的一段话,问题很显明。

轻微解释:

虚函数,和虚函数表是两个东西,就算虚函数究竟怎么调用时在Run-Time时确定,和虚函数表可未曾什么联系。

再来看另外一个解释:

vtable的内容是在编译时确定好的,每个Class都有一个vtable相对应。
在运行时,率先创立vtable的内存映象,然后,在创立对象时,将相应的vtable的地址写入对象的vptr。因而,这个问题本身就不是十鲜确定。比拟严密的该当这么说:vtable的内容是在编译时确定的,而内存中的vtable是在运行时创立的。

不过,这里有一个问题必需解释,编译时的vtable中并无须定是虚函数在运行时的恳挚地址,而很可能是一个offset,因为,代码和数据在运行时都会有一个重定向的过程,这个过程大局部情形是由垄断系统举行的,这时运行期vtable的内容即便编译时的映象;而有些时候,过程会对切身举行重定向调剂,这时内存中vtable的内容即便编译收获穿越计算获得的值

这个就不得了了,这里解释的不但是垄断系统有可能让vtable变成在运行时发生,而且有可能因为不同的编译器,而让这个vtalbe揭示Compile time确定,和Run-time确定两种情形。

(不知为什么,陡然我就开始思忖 这个问题究竟是为什么被提出来呢?为了验证什么而存在呢?)

在<<Inside the C++ Object Model>>这本书中,我看到了规范

How might the table containing the virtual function addresses be constructed? In C++,ys.yst1608.com the set of virtual functions capable of being invoked through an object of its class is known at compile time. Moreover, this set is invariant. It cannot be added to nor can a virtual instance be replaced at runtime. The table, therefore, serves only as a passive repository. Since neither its size nor its contents change during program execution, its construction and access can be completely handled by the compiler. No runtime intervention is necessary.

Having the address available at runtime, however, is only half the solution. The other half is finding the address.

即便这本经典书籍的经典内容定夺了答案。

批复Compile-Time发生虚构函数表,就对了!!!(看起来好像是一个二选一的推断题目一样)。

重要的是,万一不能解释虚构函数表指针是在运行期被初始化(告终多态的关键所在),那这道题目其实批复得未曾任何含义。对我们会意C++多态的性质和必需性也未曾帮助。

其实我想解释是:目前的测验和招聘工作中,对于一些知识点的核实,是否真的让应聘人员懂得了其与该工作岗位的差距,是否在工作岗位上会用到相干知识,是否对于告终其本职工作有帮助,还是必需出题者更好的举行琢磨!

对于以上***,迎接大家拍砖!

附注:

因为语言的多样性,不确定性,万一虚构函数表指针在运行期才被初始化,固然虚构函数表是在编译期后其大小和内容就被确定,然而也不能说就被发生了啊!!因而这道题目就变成了捣糨糊。良好改成 虚构函数表的大小和内容是什么时候确定的?(Compile-Time 可能Run- Time)

最后,顺带给出原题规范的答案:

虚构函数表是在编译期就发生了,各个虚构函数这时被组织成了一个虚构函数的入口地址的数组。

而对象的隐藏成员“虚构函数表指针”是在运行期,即构造函数被调用时举行初始化的,这是告终多态的关键。

这篇关于多态类中的虚函数表是Compile-Time,还是Run-Time时发生的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754318

相关文章

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST