v表

mjm_d 2002-03-10 10:42:49
请问如何在声明了一个类,而不做实例化的情况下知道该类的v表地址,该类存在v表这是肯定的,谢谢
...全文
203 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjm_d 2002-03-18
  • 打赏
  • 举报
回复
看来大家都江郎才尽了
mjm_d 2002-03-17
  • 打赏
  • 举报
回复
一个类有三种状态
声明;实现;实例化
我要的是如果有声明,有实现,没有实例化,如何得到V表,谢谢。
mjm_d 2002-03-17
  • 打赏
  • 举报
回复
没人会吗?
5555555555555
5555555555
5555555
5555
5
dohye 2002-03-16
  • 打赏
  • 举报
回复
vc肯定可以得到v表地址,
object::virtualfun是指向vcall调用机制的地址,
只是我不懂vcall调用机制的详细,呵呵
zhaig 2002-03-16
  • 打赏
  • 举报
回复
应该是在对象中创建虚函数时,编译器才建立v表。
所以声明类,得不到v表。
mjm_d 2002-03-13
  • 打赏
  • 举报
回复
我要的是当我声明一个类时(含虚函数)时如何不实例化就得到v表地址
mjm_d 2002-03-13
  • 打赏
  • 举报
回复
但你们的vptr=(void *)x
中的x是什么?实例吗?我要的是不做实例化得到我只要VC6的
谢谢上面几位,呆会给分
cm_w 2002-03-12
  • 打赏
  • 举报
回复
多重继下情况是复杂一些,如果加上虚继承就更复杂了。这时要得到vptr
就需要对对象此时的内存布局做更深入的研究。只要弄清楚特定编译器是
怎样处理对象布局的,就能得到vptr。
GuanXP 2002-03-12
  • 打赏
  • 举报
回复
cm_w(cm)的说法是对的,然而对多层和多重继承,却可能存在多个vtbl,一个对象可能有多个vptr,这时就很难根据偏移量判断了。
cm_w 2002-03-11
  • 打赏
  • 举报
回复
首先应该明确,C++标准只定义了语言的行为没有规定具体的实现方法,所以
对于不同的C++编译器,对象在内存中的布局是不同的,实现v表的方法也不同。找v表就象去分析类的成员函数编译后的名字一样,没有多大意义。
根据《深度探索C++对象模型》一书介绍的方法可以找到指向v表的指针(vptr)
是放在类对象的前端还是尾端。

CLASS X
{ VIRTUAL ~X();
INT A,B,C;
}
&X::A表示区A在类对象中的偏移量。
如果vptr在对象的尾端,&X::A为0
如果vptr在对象的前端,&X::A为4或5
得到vptr在对象中的布局后,就可以得到v表的地址
VC的vptr在对象的前端,所以对象地址的第一个DWORD既为vptr。
vptr=(void *)x
vcshcn 2002-03-11
  • 打赏
  • 举报
回复
类不在内存里,只有实例
fixopen 2002-03-11
  • 打赏
  • 举报
回复
vtbl是对象拥有的
dohye 2002-03-11
  • 打赏
  • 举报
回复
mjm_d(菠萝蜜多) 说的对vtbl是存在的
你可以这试一下
void (object::*p)() = object::x;
根据p的地址去查看汇编代码
mjm_d 2002-03-11
  • 打赏
  • 举报
回复
v表是全局的,只要存在该类(包含虚函数),就有v表,除非特殊声明,他是所有该类的对象共享的,我不知道如何直接得到,因为,他用class;;'vtable'这个变量,而我无法用 extern int class::'vtable'因为他会变成extern int ——class::_'vtable',有没有汇编的方法,别的也行,会的我一定给分,而且是多多的
zheng_can 2002-03-10
  • 打赏
  • 举报
回复
什么是 v表
cm_w 2002-03-10
  • 打赏
  • 举报
回复
类只有实例化后,编译器才为其分配内存,这时才有v表。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧