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

相关文章

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链