Sam*_*urn 5 c++ methods virtual inheritance data-structures
如何控制虚拟表中虚函数的顺序?它们的布局是否与它们声明的顺序相同?
继承具有虚拟表的类时,继承类的虚拟表是基类的扩展,或者是仅使用继承类虚函数创建的全新虚拟表.(即虚拟表是否仍然在类的索引+ 0x0?)
(a)就标准而言,你不能,(实际上你甚至不能假设vtable存在).(b)可能,但您需要控制订单的情况是什么,但您无法自行检查?检查的方法是查看虚拟调用的反汇编(并找到添加到vtable指针的偏移量以获取调用地址)或查看vtable本身的反汇编.
要看.对于单继承,它可能是基类的扩展,每个对象的索引0指向该类的虚拟表,指向基类中声明的每个虚函数的正确实现(可能是覆盖),后跟指向派生类中声明的每个虚函数的指针.对于多重和虚拟继承,它不是(不可能)那么简单.每个对象都包含几个指针,可以是vtable,也可以是包含vtable和其他类信息的结构,当你围绕类层次结构转换时,对象的指针值会发生变化.试试看吧.
所有这些都是一个非常假设的"典型实现".编译器编写者有他们的技巧.
| 归档时间: |
|
| 查看次数: |
1770 次 |
| 最近记录: |