多态类中的虚函数表是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

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字