高手过来看看:this, vptr, vtable!

古布 2004-04-30 01:13:01
1):this 是一个对象的地址吗?
2):如何得到一个对象的vptr,并将它赋给另一个指针。
下面能实现吗?如果是,为什么能?

class base{
public:
virtual ~base(){}
};
void *pObj = new char[10];
*(DWORD_PTR*)pObj = *( DWORD_PTR*)&base();

3):如何得到一个类的vtable,并将它赋给另一个指针.
谢谢!
...全文
169 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dananhai 2004-05-01
  • 打赏
  • 举报
回复
这是我的测试。我不知道vpr,vtable什么概念,楼主能解释一下吗?
#include<iostream.h>
class Test {
public:
Test() { cout <<"init(): "<<this<<endl;this->output(); }
void output(){cout<<"output() is called."<<endl;}
};
void main()
{Test t1;
cout <<"main() &t1: "<< &t1 << endl;
Test *pt = &t1;
cout <<"main() pt: "<< pt << endl;
}
plantlove 2004-05-01
  • 打赏
  • 举报
回复
this 是指针啊 Wolf0403(完美废人)讲得对

高手怎么不拘小节呢
xiangzhengyan 2004-04-30
  • 打赏
  • 举报
回复
我英语太差,请问zf0579(楚风萧萧)说的是这个意思吗?

地址 内容
this vtpr
vtpr vtable
angelo23 2004-04-30
  • 打赏
  • 举报
回复
如果你对 对象模型比较清楚,那么可以通过指向对象的指针(当然前提是这个对象有vptr),间接得到vptr,再间接得到vtbl的地址——关键就是要知道vptr在对象中的offset
古布 2004-04-30
  • 打赏
  • 举报
回复
to : zf0579(楚风萧萧)
这个方法可不是通用的。
xuwedo2003 2004-04-30
  • 打赏
  • 举报
回复
别说了 zf0579(楚风萧萧)说得很清楚了。
xuwedo2003 2004-04-30
  • 打赏
  • 举报
回复
同意 zf0579(楚风萧萧)所说的,也同意Wolf0403(完美废人)(期待有一天。。。) 所说的。this是一个指针,指向当前对象,所以,this中存放的就是当前对象的地址。this ==&obj;
同时《inside The c++ object model》这本书不适合刚入门的人看,那样会使你失去信心,会使你越来越迷糊,还是等两参年后对C++有较深的理解后,再看吧。
古布 2004-04-30
  • 打赏
  • 举报
回复

class Test {
public:
Test() { cout << ( this ) << endl; }

};
Test t1;
cout << (&t1) << endl;
Test *pt = &t1;
cout << ( pt ) << endl;
以上输出都一样。但如果是二级指针输出是不一样的。
古布 2004-04-30
  • 打赏
  • 举报
回复
谢谢! vcchunhong(願意偽祢), (Wolf0403(完美废人)(期待有一天。。。)
怪不得我测出的两次地址不一致。
========================
to : (Wolf0403(完美废人)(期待有一天。。。)
this 指针是二级指针吗?
后面两个问题能帮我看一下吗?谢谢!!
=========================
to : x0554(雨寒)
如果书上能找到,我又何必来这里。你不想回答就算了。又何必这样说,
Wolf0403 2004-04-30
  • 打赏
  • 举报
回复
1,不能说this是对象的地址
这样说不准确
应该说this指向的是对象的地址

错误,呵呵。 this 指向对象的地址说明 *this = &obj,刚刚多了一个间接层次。
x0554 2004-04-30
  • 打赏
  • 举报
回复
read C++ book first
vcchunhong 2004-04-30
  • 打赏
  • 举报
回复
1,不能说this是对象的地址
这样说不准确
应该说this指向的是对象的地址
2,3,这两个东西我还没有接触过
所以不懂他们是什么~
楼主能解释一下这两个词分别指的是什么吗?
cgsw12345 2004-04-30
  • 打赏
  • 举报
回复
1):this 是一个对象的地址吗?
当我们实例化一个对象时,this就指向这个对象本身!
2):如何得到一个对象的vptr,并将它赋给另一个指针。
这要看编译对对象结构的存存放,有的将vptr放在对象存储的
最开头,有的编译器放在中间,有在编译器放在最后,当然各有
各的好处,但要更应该是不能的,这些应该都是只读的,只允许
访问,但不能修改。当然,还是可以通过特特殊的方法可能实现,
不过我没这相能力,也没有试过 :)
3):如何得到一个类的vtable,并将它赋给另一个指针.
如果你得到了vptr那对vtable就容易得到,因为vptr是指向vtable的

关于这些问题有一本比较好的书《inside C++ Object Model》,你可以看看

以上仅代表个人观点,仅供参考,有不正确之处,多谢指出。大家共同进步 :)
runall 2004-04-30
  • 打赏
  • 举报
回复
不懂
zf0579 2004-04-30
  • 打赏
  • 举报
回复
1) Yes
2) in vc, the vpter always store in the first postion of object, so get the object address you can get the vptr address.
for example. if object address is 0x12ff6c, then in this address store the vtpr address.
3) vptr points to the vtable, so get the content of vptr, you can get the address of vtable.
for example. if vptr points to 0x424fec, then in this address store the vtable address.

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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