强制虚拟方法表中的函数顺序?

Sam*_*urn 5 c++ methods virtual inheritance data-structures

  1. 如何控制虚拟表中虚函数的顺序?它们的布局是否与它们声明的顺序相同?

  2. 继承具有虚拟表的类时,继承类的虚拟表是基类的扩展,或者是仅使用继承类虚函数创建的全新虚拟表.(即虚拟表是否仍然在类的索引+ 0x0?)

Bil*_*eal 7

这是完全实现定义的.C++标准根本没有指定任何类型的虚函数表 - 这就是它通常的实现方式.


Ste*_*sop 7

  1. (a)就标准而言,你不能,(实际上你甚至不能假设vtable存在).(b)可能,但您需要控制订单的情况是什么,但您无法自行检查?检查的方法是查看虚拟调用的反汇编(并找到添加到vtable指针的偏移量以获取调用地址)或查看vtable本身的反汇编.

  2. 要看.对于单继承,它可能是基类的扩展,每个对象的索引0指向该类的虚拟表,指向基类中声明的每个虚函数的正确实现(可能是覆盖),后跟指向派生类中声明的每个虚函数的指针.对于多重和虚拟继承,它不是(不可能)那么简单.每个对象都包含几个指针,可以是vtable,也可以是包含vtable和其他类信息的结构,当你围绕类层次结构转换时,对象的指针值会发生变化.试试看吧.

所有这些都是一个非常假设的"典型实现".编译器编写者有他们的技巧.