游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2058|回复: 4

问一下C++的虚表问题

[复制链接]

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2005-2-24 20:11:00 | 显示全部楼层 |阅读模式
一个包含虚函数的基类base   和   由这个类派生出来的类derive  以及定义的这两个类的对象baseObject  和  deriveObject

这两个对象的虚表有没有什么关系  他们是怎样实现回溯的?



尤其当虚函数为基类的析构函数时 又是怎么实现的


最好能画张图出来  

(以前没有好好学   后悔啊 !!)

22

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2005-2-25 10:00:00 | 显示全部楼层

Re:问一下C++的虚表问题

我想,这2个对象虚表应该相同吧,虚表里面每个"条目"应该记录着 在当前派生类对虚函数重写的函数 的偏移(好像是相对于THIS指针), 运行时, 通过加上偏移得到正确虚函数地址,如果没重写,它应该会指向上一层基类的相应虚函数,这样算回溯吧.
析构也一样,重写就执行新的,不重写执行上一层基类的.
你去书店,买<<深入VC++...>>,上面有对比 C++和编译生成的ASM的比较,对C++各种机制都详细说明(在ASM上).

26

主题

324

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
QQ
发表于 2005-2-25 13:54:00 | 显示全部楼层

Re:问一下C++的虚表问题

1.base class和derived class的virtual table是一个,只是若derived class新增或是重写了base class的virutual function才会在原表基础上添加或是改写函数的地址。
2.若virtual function是base class的destructor,则derived class的destructor也是virtual的,两者在virtual table的相同位置,只是指向的地址不同。

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2005-2-25 16:47:00 | 显示全部楼层

Re:问一下C++的虚表问题

通过对象里的虚表指针找到虚表,然后根据偏移来找实际函数地址,如果没有改写,这个表项的地址还是用的基类虚表里那个表项的地址

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2005-2-25 20:55:00 | 显示全部楼层

Re: 问一下C++的虚表问题

明白了

谢谢各位了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 11:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表