游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3674|回复: 11

请教:c++ vtable的问题

[复制链接]

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2005-7-18 09:53:00 | 显示全部楼层 |阅读模式
比如:

class CBase1
{
public:
     virtual void vf1(){}
};

class CBase2
{
public:
     virtual void vf2(){}
};

class CDerived : public CBase1, public CBase2
{
public:
     virtual void vf3(){}
}

我知道在 CDerived 类中有两个虚函数表,一个是CBase1的,一个是CBase2的。

请问:CDerived 类的虚函数 vf3 的指针是放在哪里呢?

24

主题

94

帖子

96

积分

注册会员

Rank: 2

积分
96
发表于 2005-7-18 12:04:00 | 显示全部楼层

Re:请教:c++ vtable的问题

或许应该是 打算放在继承它的类里面

(看似可能有错,逃。。。)

9

主题

266

帖子

266

积分

中级会员

Rank: 3Rank: 3

积分
266
发表于 2005-7-18 13:06:00 | 显示全部楼层

Re:请教:c++ vtable的问题

派生类的前4个字节是VTABLE指针,获得这个指针后就直接调用  vtable->vf3();
  
Derived虚函数表有2个???

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2005-7-18 21:23:00 | 显示全部楼层

Re:请教:c++ vtable的问题

回楼上:

      我看的 inside c++ object modal。因为CDerived是多继承,所以它里面有CBase1和

CBase2的虚函数表。

      但我不知道CDerived自己的虚函数指针放在哪个表里,请教各位。

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2005-7-18 22:02:00 | 显示全部楼层

Re: 请教:c++ vtable的问题

CDerived类的虚函数表指针应该是由自己单独保存吧,感觉一个CDerived对象应该是这个样子:
sf_200571822159.gif

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2005-7-19 00:03:00 | 显示全部楼层

Re:请教:c++ vtable的问题

多谢楼上的图。

可我sizeof(CDerived)结果是8,也就是说CDerived类的只有两个vptr,是CBase1和CBase2的,

这个与你的图矛盾了?

42

主题

418

帖子

418

积分

中级会员

Rank: 3Rank: 3

积分
418
发表于 2005-7-19 09:07:00 | 显示全部楼层

Re:请教:c++ vtable的问题

www.vckbase.com
可以去这里问问

18

主题

631

帖子

660

积分

高级会员

Rank: 4

积分
660
发表于 2005-7-19 09:32:00 | 显示全部楼层

在内存显示是这样的。

.................
sf_200571993216.bmp

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2005-7-19 10:00:00 | 显示全部楼层

Re:请教:c++ vtable的问题

多谢大家!

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2005-7-19 21:09:00 | 显示全部楼层

Re: Re:请教:c++ vtable的问题

death: Re:请教:c++ vtable的问题

多谢楼上的图。

可我sizeof(CDerived)结果是8,也就是说CDerived类的只有两个vptr,是CBase1和CBase2的,

这个与你的图矛盾了?


回去试了一下,那个图确实有问题。
似乎CDerived的vtable应该合到第一父类的vtable里了,因为试了一下下面的代码:

class CBase
{
public:
     virtual void vf1(){}
};

class CDerived : public CBase
{
public:
     virtual void vf2(){}
};

sizeof CDerived类得到的值是4。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-26 11:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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