如何控制虚拟表中虚拟函数的顺序?它们的排列顺序是否与声明的顺序相同?
当继承带有虚表的类时,继承类的虚表是基类的扩展,还是仅用继承类的虚函数创建的全新虚表。 (即虚拟表仍然位于类的索引 +0x0 处吗?)
(a) 就标准而言,你不能,(事实上你甚至不能假设 vtable 存在)。 (b) 可能吧,但是什么情况下你需要控制订单,但你自己无法检查?检查的方法是查看虚拟调用的反汇编(并找到添加到 vtable 指针的偏移量以获取调用地址)或查看 vtable 本身的反汇编。
依靠。对于单一继承,可能是基类的扩展,每个对象的索引 0 指向该类的虚拟表,并带有指向基类中声明的每个虚拟函数的正确实现(可能是覆盖)的指针,然后是指向派生类中声明的每个虚函数的指针。对于多重继承和虚拟继承来说,事情没有(不可能)那么简单。每个对象将包含多个指针,要么指向 vtable,要么指向包含 vtable 和其他类信息的结构,并且当您围绕类层次结构进行转换时,对象的指针值会发生变化。尝试一下看看。
所有这一切都是为了一个非常假设的“典型实现”。编译器编写者有他们的技巧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)