多态类中的虚函数表是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中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

python subprocess.run中的具体使用

《pythonsubprocess.run中的具体使用》subprocess.run是Python3.5及以上版本中用于运行子进程的函数,它提供了更简单和更强大的方式来创建和管理子进程,本文就来详细... 目录一、详解1.1、基本用法1.2、参数详解1.3、返回值1.4、示例1.5、总结二、subproce

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。